我做了一个串口通信程序:用了数据接收线程,数据显示线程(主界面中)。
开始我采取的办法:当接收到数据并且处理完毕后,将处理结果保存到全局变量,然后用postmessage()发送消息到显示窗口,显示窗口的消息函数进行显示。如果用多线程,如何在线程间通信?用PostThreadMessage行吗?怎么用?

解决方案 »

  1.   

    1 如果你的是worker工作线程,而不是UI线程,不能进行消息处理
    2 你可以用事件/公用变量等等进行传递
      

  2.   

    可以用PostThreadMessage,例如:
    //发送线程
    Procedure TThread1.Execute;
    var
      sMes:String;
      pMes:^String;
      iTemp:Integer;
    begin
      sMes:='Test';
      New(pMes);
      pMes^:=sMes;
      PostThreadMessage(thread2.ThreadID,WM_StartRecording,Integer(pMes),0);
      
      iTemp:=111;
      PostThreadMessage(thread2.ThreadID,WM_OriginalData,iTemp,0);
    end;//接受线程
    procedure TThread2.Execute;
    var
      msg:TMsg;
      sMes:String;
      pMes:^String;
      iTemp:Integer;
    begin
      //消息循环
      while GetMessage(msg,0,0,0) do
      begin
        Case msg.message of
          WM_StartRecording:
          begin
            //传过来的是String;
            pMes:=msg.wParam;
            sMes:=pMes^;
            Dispose(pMes);
          WM_OriginalData:
          begin
            //传过来的是整数
            iTemp:=msg.WParam;
          end;
          else begin
            TranslateMessage(msg);
            DispatchMessage(msg);
          end;
        end;
      end;
    end;
      

  3.   

    worker工作线程也可以消息通信吧??Borland的VCL中所有的WinControl的实例共享一个WndProc,然后通过汇编跳转到各个不同的实例,调用其相应的WndProc。MFC的所有WinControl的所有实例也是共享一个WndProc,但它是将WndProc中的HWND参数进行Hash,直接得出相应的WinControl的指针,再调用其特定对象的wndproc。自己做一个新的worker工作线程类,用AllocateHwnd和DeallocateHWnd分配和释放一个Hwnd,再处理相应的WndProc应该就可以了把?C++做过,delphi没做过,但我想这应该都是一样的把??
      

  4.   

    worker工作线程也可以进行消息通信吧??Borland的VCL中所有的WinControl的实例共享一个WndProc,然后通过汇编跳转到各个不同的实例,调用其相应的WndProc。
    MFC的所有WinControl的所有实例也是共享一个WndProc,但它是将WndProc中的HWND参数进行Hash,直接得出相应的WinControl的指针,再调用其特定对象的wndproc。自己写一个worker工作线程类接收到消息的应该不难吧??
    在自己的工作线程类中处理WndProc就可以了
    delphi没有做过,c++做过