delphi2007 教程

delphi2007 教程

首页 新随笔 联系 聚合 管理
  1013 Posts :: 0 Stories :: 28 Comments :: 0 Trackbacks
请指点一下,讨论也可以,顶也有分 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061206091917269.html
先说我一直以来的观点,不知对错。  
   
  多线程的同步有三个方法,建互斥锁,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中的内容是混杂在一起的。  
   
  我在函数中加了互斥量,问题才解决了,为什么是这样呢,判各位指点。

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

帮顶   消息是队列。。。

同步还有临界区的方式,但只能用在同步同一个进程的多个线程,但它的速度最快,占用资源最少。  
   
 

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

不是并发,但是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;   }

晕,这样的问题才叫基础问题?

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

posted on 2009-04-22 10:44 delphi2007 阅读(96) 评论(0)  编辑 收藏 引用
只有注册用户登录后才能发表评论。