请教高手!
我写了一个多线程的程序,一个主线程,两个子线程,子线程中是数据采集卡操作函数,不停的采集,两个子线程分别对应两块采集卡。采集到一定数量的数据后,发送消息给主线程,主线程去读缓冲区,使用VCL控件TChart来实时显示,大概1秒多刷新一次。程序运行没有问题,但是当我移动程序窗口时,界面内的TChart控件立刻停止显示,程序像是死了一样。
后来上网查到了application.ProcessMessage这个方法,可是我不知道应该加在什么地方,是在子线程中呢,还是主线程中呢?
我写了一个多线程的程序,一个主线程,两个子线程,子线程中是数据采集卡操作函数,不停的采集,两个子线程分别对应两块采集卡。采集到一定数量的数据后,发送消息给主线程,主线程去读缓冲区,使用VCL控件TChart来实时显示,大概1秒多刷新一次。程序运行没有问题,但是当我移动程序窗口时,界面内的TChart控件立刻停止显示,程序像是死了一样。
后来上网查到了application.ProcessMessage这个方法,可是我不知道应该加在什么地方,是在子线程中呢,还是主线程中呢?
解决方案 »
- ???????????????
- indy9.00.10的IdFTP.list(aStrLst,'*.txt',False)在文件不存的情况下出错!
- 谁要电子图书(VC、Delphi、Java)
- 一个奇怪的ADO问题,请各位大侠帮忙....
- 有那些函数可以删除文件夹?
- 这是不是DELPHI 6.0的BUG啊?
- 都是不懂法若的祸~~
- 更新问题,有的进去了,有的没进,请进来看看。
- 什么破玩意儿DELPHI,导入ACTIVEX控件总是出错!!!
- 新手问问题:用Delphi做大型的数据库时,是不是最好都选用TDBxxx的控件
- alib component 下载不了,那位大大提供了下!谢谢!
- 关于SaveToFile的用法
这个方法一般加到 for 循环语句中 是为了防止死循环的
当然有关系,你动了,那TChart在Refresh,而同时,线程又来操作这个TChart,那会不会有问题呢?
function SendCommCmd(Command: PChar; RcvBuffer: PChar; var Len: Integer): Integer; stdcall;
var
i: DWord;
begin
if not IsActive then
begin
Result := ERR_SC_NOTACTIVE;
Exit;
end;
if IsBusy then
begin
Result := ERR_SC_BUSY;
Exit;
end; IsBusy := True;
try
Received := False;
RcvBuf := RcvBuffer;
BufLen := @Len; Comm.WriteCommData(Command, Len);
i := GetTickCount();
while (not Received) and IsActive do
begin
if GetTickCount() - i >= ReadTimeout then
begin
Result := ERR_SC_TIMEOUT;
Exit;
end;
Application.ProcessMessages;
end; if not IsActive then
begin
Result := ERR_SC_NOTACTIVE;
Exit;
end; Result := ERR_SC_SUCCESS;
finally
IsBusy := False;
end;
end;
这句的目的就是让程序在这个时候去取消息列表里的消息做处理,防止消息一直没被处理(如wm_paint没处理界面就死了).
不知道楼主说的主线程是否就是应用的线程,如果是单独的线程的话,要在适当的地方加Application.ProcessMessages
所有的界面更新都是在主线程中完成的.而在移动的时候,主线程仅是去处理移动的效果去了.其它的绘制窗体
的消息全都忽略掉了.
不要用同步方式即可。
同步方式是和VCL阻塞的。
异步方式编程麻烦一点,你自己多处理一下吧,用PostMessage即可。