原创 TObjectQueue和TObjectStack应用

2011-1-8 22:54 2090 10 10 分类: 软件与OS

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的帮助资料实在是太少了,网上的资料也少,学起来吃力呀~~希望这段小代码对一些人有帮助.a1ae58bb-88e0-4f64-b1bb-e6317bfe4e47.JPG


 <梅川酷子原创>

文章评论0条评论)

登录后参与讨论
我要评论
0
10
关闭 站长推荐上一条 /2 下一条