首页 > Windows开发 > 详细

用SendNotifyMessage代替PostMessage避免消息丢失(WIN7下消息队列的默认长度是10000,队列满后消息将被丢弃)

时间:2017-09-06 17:53:36      阅读:523      评论:0      收藏:0      [点我收藏+]

大家都知道PostMessage会丢消息,但是消息队列的大小是多少呢,下面做了一个测试。

代码:
 
技术分享
 1 unit Unit1; 
 2 
 3 interface 
 4 
 5 uses 
 6   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
 7   Dialogs, StdCtrls; 
 8 
 9 const 
10   UM_ADD = WM_USER + 100; 
11 
12 type 
13   TForm1 = class(TForm) 
14     Label1: TLabel; 
15     procedure FormCreate(Sender: TObject); 
16   private 
17     FVal: Integer; 
18     procedure OnMsgAdd(var Msg: TMsg); message UM_ADD; 
19   public 
20     { Public declarations } 
21   end; 
22 
23 var 
24   Form1: TForm1; 
25 
26 implementation 
27 
28 {$R *.dfm} 
29 
30 procedure TForm1.FormCreate(Sender: TObject); 
31 var 
32   i: Integer; 
33 begin 
34   for i:=0 to 1000000 do 
35     PostMessage(Handle, UM_ADD, 0, 0); 
36 end; 
37 
38 procedure TForm1.OnMsgAdd(var Msg: TMsg); 
39 begin 
40   Inc(FVal); 
41   Label1.Caption := IntToStr(FVal); 
42 end; 
43 
44 end.
技术分享

XP下运行结果:
技术分享 

可见,消息队列的默认长度是10000(在WIN7下运行结果是9998),队列满后消息将被丢弃。
 
如果把代码中的PostMessage改成SendNotifyMessage,运行后过了一段时间,窗口弹出:
技术分享
技术分享
 
所以,功能类似的SendNotifyMessage不会丢掉消息,必要时可以用它代替PostMessage。
上面的结论是错误的,SendNotifyMessage并没有那么神奇,上面的例子没有丢失消息的原因是因为
SendNotifyMessage发消息给同线程创建的窗口时,采用的是直接调用窗口函数的方式,换句话说
就是在执行SendMessage。
 
http://www.cnblogs.com/ddgg/archive/2013/03/31/2991595.html

用SendNotifyMessage代替PostMessage避免消息丢失(WIN7下消息队列的默认长度是10000,队列满后消息将被丢弃)

原文:http://www.cnblogs.com/findumars/p/7486011.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!