zoukankan      html  css  js  c++  java
  • 用SendNotifyMessage代替PostMessage避免消息丢失(WIN7下消息队列的默认长度是10000,队列满后消息将被丢弃)

    大家都知道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
  • 相关阅读:
    Superset 制作图表
    superset 安装配置
    python 虚拟环境 pyenv
    pymysql 单独获取表的栏位名称
    pymysql 返回数据为字典形式(key:value--列:值)
    Oracle/MySQL decimal/int/number 转字符串
    netstat 问题处理
    MySQL 中Index Condition Pushdown (ICP 索引条件下推)和Multi-Range Read(MRR 索引多范围查找)查询优化
    MySQL执行计划extra中的using index 和 using where using index 的区别
    ref与out
  • 原文地址:https://www.cnblogs.com/findumars/p/7486011.html
Copyright © 2011-2022 走看看