如何操作Collections.TQueue命令?

时间:2015-01-26 13:05:46

标签: delphi queue delphi-xe2

我有一个队列,我在其中存储要传输的数据包:

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提供的所有功能?

更新:拥有2个队列是一个解决方案,但我的代码中还有另一个地方需要访问Queue项目,例如:我在哪里打印队列:

DebugMsg('Contents of Tx-Queue:');
for i := 0 to (tx_queue.Count - 1) do
    DebugMsg(tx_queue.FItems[i]);

或迭代队列的函数,计算某个ID已排队的数据包的数量。

2 个答案:

答案 0 :(得分:3)

队列并不意味着以您想要操纵数据结构的方式进行操作。请改用TList。使用Add将内容放在背面,Insert将东西放在前面,ExtractItem(0)来取回第一个项目。

答案 1 :(得分:1)

如果您希望为不同的项目分配不同的优先级,那么一种常见的方法是实现两个队列。一个用于高优先级项目,一个用于其余项目。在考虑其他项目之前,请排出高优先级项目。

可以枚举TQueue<T>的项目。因此,您可以为派生类TObjectQueue<T>执行此操作。 TQueue<T>类提供了一个枚举器,因此您可以像这样编写代码:

DebugMsg('Contents of Tx-Queue:');
for item in tx_queue do
  DebugMsg(item);