TObjectQueue在某些数据处理的应用非常有用,比如一个串口接收到数据后,保存到TObjectQueue对象中,而另外一个线程则将数据从TObjectQueue对象中取出,这时,TObjectQueue对象就起到了FIFO,即First In First Out,先进先出.合理
地利用TObjectQueue,可以让程序无需等待,提高效率.
但是C++ Builder提供的TObjectQueue只能保存指针型变量,对于实数型变量无能为力,同样,TObjectStack也一样,只能保存指针.在处理字节流的时候需要用到队列和堆栈怎么办呢?有个简单的办法,就是手动开辟一个缓冲区,然后让
TObjectQueue/TObjectStack对象指向这个缓冲区,缓冲区用来保存数据,而把数据指针存放到TObjectQueue/TObjectStack中.实际应用中可以根据实际的数据类型来开辟缓冲区.下面代码将用byte型来演示.
//------------------------------数据队列的实现-------------------------------
int _iQueueIndex=0;//队列索引
byte _QueueBuffer[1024];//数据队列缓冲区
TObjectQueue *_Queue=new TObjectQueue;
void __fastcall TForm1::EnQueue(byte byt)
{
_QueueBuffer[_iQueueIndex]=byt;
_Queue->Push((TObject *)&_QueueBuffer[_iQueueIndex++]);
}
byte __fastcall TForm1::DeQueue(void)
{
byte *p;
p=(byte *)(_Queue->Pop());
_iQueueIndex--;
return *p;
}
//------------------------------数据堆栈的实现-------------------------------
int _iStackIndex=0;//堆栈索引
byte _StackBuffer[1024];//数据堆栈缓冲区
TObjectStack *_Stack=new TObjectStack;
void __fastcall TForm1::PushIn(byte byt)
{
_StackBuffer[_iStackIndex]=byt;
_Stack->Push((TObject *)&_StackBuffer[_iStackIndex++]);
}
byte __fastcall TForm1::PopOut(void)
{
byte *p;
p=(byte *)(_Stack->Pop());
_iStackIndex--;
return *p;
}
实际应用还需要加入缓冲区个数,队列和堆栈是否为空等功能,在此将不作详细说明.
另外,C++ BUILDER的帮助资料实在是太少了,网上的资料也少,学起来吃力呀~~希望这段小代码对一些人有帮助.
<梅川酷子原创>
文章评论(0条评论)
登录后参与讨论