帅
帅义庭
Unregistered / Unconfirmed
GUEST, unregistred user!
问题背景:主窗体中利用UDP控件接收其它设备发送来的数据包(每个报长度固定100字节),把数据包插入到数据缓冲区队列中并修改缓冲区队列的有关指针,//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//// 接收UDP数据包 ////~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//procedure TfrmMain.UDPServerUDPRead(Sender: TObject;
AData: TStream;
ABinding: TIdSocketHandle);var sz:INTEGER;
rbuf:ARRAY[0..100-1] of BYTE;
begin
AData.Read(rbuf,sz);
//读数据包 mQuene.InsertQuene( @mbuf[0],sizeof(mbuf) );
//把接收的数据包插入到缓冲区队列中end;
数据处理线程从数据缓冲区队列中取出并分析这些数据,线程取出数据后要修改缓冲区的指针;//*********************************// 任务执行程序 *//*********************************Procedure CJZTHREAD.Execute;
begin
Repeat Synchronize(DoTask);
//(1) //DOTask();
//(2) //TApplication(self).processMessages();
//(3) until(Terminated);
end;
我的问题: 数据缓冲区队列(mQuene)是主线程和数据处理线程(CJZTHREAD)的关键区域,如果在数据处理线程(CJZTHREAD)的DoTask的调用采用的是Synchronize(DoTask);那么无论是主线程还是数据处理线程(CJZTHREAD),在访问数据缓冲区队列(mQuene)时,都不需要在作任何线程间任何同步的操作,对吗? 相反如果在线程中直接调用DoTask()过程,则在访问公共数据缓冲区队列时必须使用一些同步的操作,是吗?在Procedure CJZTHREAD.Execute;中如果采用Synchronize(DoTask);
而把(3)删除则计算机启动程序运行时好像有一种死机的现象(主窗体上面的各种文字数据都非常非常慢才显示出来,如果把鼠标在WINDOWS 2000最下面一行的状态栏中点一下主窗体上的字可以立即显示出来);
AData: TStream;
ABinding: TIdSocketHandle);var sz:INTEGER;
rbuf:ARRAY[0..100-1] of BYTE;
begin
AData.Read(rbuf,sz);
//读数据包 mQuene.InsertQuene( @mbuf[0],sizeof(mbuf) );
//把接收的数据包插入到缓冲区队列中end;
数据处理线程从数据缓冲区队列中取出并分析这些数据,线程取出数据后要修改缓冲区的指针;//*********************************// 任务执行程序 *//*********************************Procedure CJZTHREAD.Execute;
begin
Repeat Synchronize(DoTask);
//(1) //DOTask();
//(2) //TApplication(self).processMessages();
//(3) until(Terminated);
end;
我的问题: 数据缓冲区队列(mQuene)是主线程和数据处理线程(CJZTHREAD)的关键区域,如果在数据处理线程(CJZTHREAD)的DoTask的调用采用的是Synchronize(DoTask);那么无论是主线程还是数据处理线程(CJZTHREAD),在访问数据缓冲区队列(mQuene)时,都不需要在作任何线程间任何同步的操作,对吗? 相反如果在线程中直接调用DoTask()过程,则在访问公共数据缓冲区队列时必须使用一些同步的操作,是吗?在Procedure CJZTHREAD.Execute;中如果采用Synchronize(DoTask);
而把(3)删除则计算机启动程序运行时好像有一种死机的现象(主窗体上面的各种文字数据都非常非常慢才显示出来,如果把鼠标在WINDOWS 2000最下面一行的状态栏中点一下主窗体上的字可以立即显示出来);