如何操纵Collections.TQueue顺序?
How to manipulate Collections.TQueue order?
我有一个队列,我在其中存储要传输的数据包:
TfrmFoo = class(TForm)
public
tx_queue: System.Generics.Collections.TObjectQueue<TPacket>;
有时我需要将具有最高优先级的数据包排队。我会这样做:
for i := 0 to tx_queue.Count do
// Shift all queue items one space up the queue.
tx_queue.FItems[tx_queue.Count - i + 1] :=
tx_queue.FItems[tx_queue.Count - i];
// Add a packet to the--now vacant--top-most position.
tx_queue.FItems[0] := VipPacket;
不幸的是,FItems
是私有的,所以我无法访问它:
E2361 Cannot access private symbol {System.Generics.Collections}TQueue<Comm.TPacket>.FItems
如何在不滚动我自己的 FIFO 队列数据结构的情况下执行我描述的操作,因为我仍然希望能够使用 stdlib 提供的所有功能?
UPDATE:拥有 2 个队列是一种解决方案,但我的代码中还有另一个地方需要访问队列项,例如我在哪里打印队列:
DebugMsg('Contents of Tx-Queue:');
for i := 0 to (tx_queue.Count - 1) do
DebugMsg(tx_queue.FItems[i]);
或循环遍历队列并计算已排队的特定 ID 数据包的数量的函数。
队列不应该按照您想要的数据结构方式进行操作。请改用 TList
。使用 Add
将东西放在后面,Insert
将东西放在前面,使用 ExtractItem(0)
获取第一项。
如果您希望为不同的项目分配不同的优先级,那么一种常见的方法是实现两个队列。一个用于高优先级项目,一个用于其他项目。在考虑其他项目之前用尽高优先级项目。
可以枚举TQueue<T>
的项目。因此,您可以对派生的 class TObjectQueue<T>
这样做。 TQueue<T>
class 提供了一个枚举器,因此您可以这样编写代码:
DebugMsg('Contents of Tx-Queue:');
for item in tx_queue do
DebugMsg(item);
我有一个队列,我在其中存储要传输的数据包:
TfrmFoo = class(TForm)
public
tx_queue: System.Generics.Collections.TObjectQueue<TPacket>;
有时我需要将具有最高优先级的数据包排队。我会这样做:
for i := 0 to tx_queue.Count do
// Shift all queue items one space up the queue.
tx_queue.FItems[tx_queue.Count - i + 1] :=
tx_queue.FItems[tx_queue.Count - i];
// Add a packet to the--now vacant--top-most position.
tx_queue.FItems[0] := VipPacket;
不幸的是,FItems
是私有的,所以我无法访问它:
E2361 Cannot access private symbol {System.Generics.Collections}TQueue<Comm.TPacket>.FItems
如何在不滚动我自己的 FIFO 队列数据结构的情况下执行我描述的操作,因为我仍然希望能够使用 stdlib 提供的所有功能?
UPDATE:拥有 2 个队列是一种解决方案,但我的代码中还有另一个地方需要访问队列项,例如我在哪里打印队列:
DebugMsg('Contents of Tx-Queue:');
for i := 0 to (tx_queue.Count - 1) do
DebugMsg(tx_queue.FItems[i]);
或循环遍历队列并计算已排队的特定 ID 数据包的数量的函数。
队列不应该按照您想要的数据结构方式进行操作。请改用 TList
。使用 Add
将东西放在后面,Insert
将东西放在前面,使用 ExtractItem(0)
获取第一项。
如果您希望为不同的项目分配不同的优先级,那么一种常见的方法是实现两个队列。一个用于高优先级项目,一个用于其他项目。在考虑其他项目之前用尽高优先级项目。
可以枚举TQueue<T>
的项目。因此,您可以对派生的 class TObjectQueue<T>
这样做。 TQueue<T>
class 提供了一个枚举器,因此您可以这样编写代码:
DebugMsg('Contents of Tx-Queue:');
for item in tx_queue do
DebugMsg(item);