先说我一直以来的观点,不知对错。多线程的同步有三个方法,建互斥锁,Synchronize和消息。前两个我不说了,只说消息。我作的消息同步就是把需要同步的操作放到主窗体的消息响应事件中。
即:
procedure TfrmMain.DO_USERMSG(var Message: TMessage); message WM_USERMSG;
begin
  //do something
end;每个线程在满足条件时会给主窗体发消息。这样DO_USERMSG函数是在主线程中执行的函数,应该不存在并发问题。但是实际上不是这样的,比如把函数改为:procedure TfrmMain.DO_USERMSG(var Message: TMessage); message WM_USERMSG;
begin
  Memo1.Lines.Add(format("收到线程%d消息",[Message.LParam]));
  Memo1.Lines.Add(format("收到线程%d消息",[Message.LParam]));
  Memo1.Lines.Add(format("收到线程%d消息",[Message.LParam]));
  
  Memo1.Lines.Add(format("收到线程%d消息",[Message.LParam]));
  Memo1.Lines.Add(format("收到线程%d消息",[Message.LParam]));
  Memo1.Lines.Add(format("收到线程%d消息",[Message.LParam]));
  Memo1.Lines.Add(format("收到线程%d消息",[Message.LParam]));
  Memo1.Lines.Add(format("收到线程%d消息",[Message.LParam]));
end;Memo1中的内容是混杂在一起的。我在函数中加了互斥量,问题才解决了,为什么是这样呢,判各位指点。

解决方案 »

  1.   

    线程的消息同步不是WIN系统的Postmessage 或 SendMessage 《WINDOWS核心编程》仔细看看,绝对值得购买。
      

  2.   

    我不理解的主要是DO_USERMSG函数好像是并发执行的。
      

  3.   

    不是并发,但是memo处理的响应速度不及时,导致看起来像并发,界面完成一个消息的工作是需要时间的,不然Delphi的线程也不会有这段提示了:
    { Important: Methods and properties of objects in VCL or CLX can only be used
      in a method called using Synchronize, for example,      Synchronize(UpdateCaption);  and UpdateCaption could look like,    procedure xxxx.UpdateCaption;
        begin
          Form1.Caption := 'Updated in a thread';
        end; }
      

  4.   

    发送消息的时候用PostMessage不用SendMessage