编写了一个程序,主界面(主线程)负责图像处理保存,后台线程负责发送数据到服务器。辅助线程的Execute中,调用另一个TransData方法。Execute的代码:
procedure TTransThread.execute;
begin
inherited;
//Synchronize(TransData); 阻塞(同步)方式,主界面切换输入法正常
TransData; 非阻塞(非同步),主界面切换输入法屏幕死屏,输入法出不来,直到TransData调用完毕才能正常显示
end;TransData的代码模型:
procedure TTransThread.TransData;
begin
while true do
begin
for i:=0 to 服务器结点数量-1 do
begin
for j:=0 to 图像数量-1 do
begin
SendImage(j,i);//此过程是另一个C++的DLL提供的方法,因图像比较大,所以比较费时
application.ProcessMessages;
end;
application.ProcessMessages;
end;
end;
end;该如何解决非阻塞方式下,切换输入法时候的死机现象?发现其实死机时候,线程是处于调用SendImage(j,i);的状态,该如何解决。
另外:
如果在Execute中采用阻塞方式的话,那么由于后台一直循环发送,导致主界面全部阻塞,点任何按钮都没反应。因此我采用的非阻塞方式的。如果能给出好的思路,给100分,能给出解决办法的,给200分
procedure TTransThread.execute;
begin
inherited;
//Synchronize(TransData); 阻塞(同步)方式,主界面切换输入法正常
TransData; 非阻塞(非同步),主界面切换输入法屏幕死屏,输入法出不来,直到TransData调用完毕才能正常显示
end;TransData的代码模型:
procedure TTransThread.TransData;
begin
while true do
begin
for i:=0 to 服务器结点数量-1 do
begin
for j:=0 to 图像数量-1 do
begin
SendImage(j,i);//此过程是另一个C++的DLL提供的方法,因图像比较大,所以比较费时
application.ProcessMessages;
end;
application.ProcessMessages;
end;
end;
end;该如何解决非阻塞方式下,切换输入法时候的死机现象?发现其实死机时候,线程是处于调用SendImage(j,i);的状态,该如何解决。
另外:
如果在Execute中采用阻塞方式的话,那么由于后台一直循环发送,导致主界面全部阻塞,点任何按钮都没反应。因此我采用的非阻塞方式的。如果能给出好的思路,给100分,能给出解决办法的,给200分
解决方案 »
- 双击delphi工程文件可以打开一个新的delphi IDE环境吗?
- 怎样用清空access数据表
- 如何在DBGRID构件中的指定列显示COMBOBOX构件并使COMBOBOX显示记录中的内容?
- 谁作过餐饮管理系统中的厨房打印模块?
- 文件操作的问题?
- 怎样用iShellLink生成快捷方式?
- 郁闷,散分!怎么能提高自己的信誉分?
- 在DELPHI中应该如何实现一个自动对象呢?谢谢!
- mm虚心请教!!远程控制界面,界面要好看,还要开发时间短,用delphi合适吗?
- Kao,金山词霸的MMX下的半透明技术!源代码!绝对的技术!
- 用ADO连接,更新数据库,是不是不用提交可以?
- delphi5中通过ado连sybase?
~~~~~~~~~~~~~
把发送放到一个线程中,并不需要同步到主线程的,界面不会阻塞
参考帖子
http://topic.csdn.net/t/20041028/19/3500916.html
你说:把发送放到一个线程中,并不需要同步到主线程的,界面不会阻塞================================================================
我是在主线程中创建后台线程的实例:
procedure TFormMain.FormShow(Sender:TObject)
begin
//创建后台线程
TransThread :=TTransThread.Create(true);
TransThread.Resume;
end;TransThread.Resume;会调用线程的Execute,也就是:TransThread.Execute
我在TransThread.Execute如果采用:Synchronize(TransData);那么就会阻塞主界面FormMain,你说不会阻塞我没清楚你的意思。请说清楚点可以吧TransData 是TransThread里的实际发送图像的一个过程。处于无限循环中,即使无可发送图像也空转。TransThread是继承自TThread的
=======================
TransData的代码模型:
procedure TTransThread.TransData;
begin
while true do
begin
for i:=0 to 服务器结点数量-1 do
begin
for j:=0 to 图像数量-1 do
begin
SendImage(j,i);//此过程是另一个C++的DLL提供的方法,因图像比较大,所以比较费时
application.ProcessMessages; //既然是在一个线程中了,这句是没用的
end;
application.ProcessMessages; //包括这句
end;
end;
end;