请指点一下,讨论也可以,顶也有分

请指点一下,讨论也可以,顶也有分 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值