编写了一个程序,主界面(主线程)负责图像处理保存,后台线程负责发送数据到服务器。辅助线程的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分

解决方案 »

  1.   

    如果在Execute中采用阻塞方式的话,那么由于后台一直循环发送,导致主界面全部阻塞,点任何按钮都没反应。因此我采用的非阻塞方式的。
    ~~~~~~~~~~~~~
    把发送放到一个线程中,并不需要同步到主线程的,界面不会阻塞
      

  2.   

    不过输入法切换的问题好像没法解决
    参考帖子
    http://topic.csdn.net/t/20041028/19/3500916.html
      

  3.   

    to postren(小虫):
    你说:把发送放到一个线程中,并不需要同步到主线程的,界面不会阻塞================================================================
    我是在主线程中创建后台线程的实例:
    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的
      

  4.   

    其实我就是这样做的。TransData放在独立的线程TTransThread里的啊。Execute里没有加同步,确实不会阻塞主界面,但是因为TransData里调用C++ DLL提供的图像发送功能,因图像大,所以这一块阻塞住了因为是C++提供的,无法跟踪到其内部,如果可以,那就可以在内部适当的时候调用application.ProcessMessages;  应该也就可以解决。但是现在的问题是不能。因为C++ DLL不是我写的。
      

  5.   

    Synchronize(TransData); //这样操作就是把TransData让主线程处理了,所以会阻塞,没必要这样做
    =======================
    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;
      

  6.   

    这样使会阻塞,我没用Synchronize(TransData); 用的是TransData; 现在要解决的问题是主界面切换输入法,怎么让它不死机。注意TransData里采用的是无限循环,即使无数据发送也空转