CWnd下几个相似的WindowMessageFunctions的讨论

首先概要的说
SendMessage
向CWnd对象发送一个消息, 直到这条消息被处理之后才返回
PostMessage
将一条消息放入应用程序的消息队列, 然后不等窗口处理这条消息直接返回
SendNotifyMessage
将一条消息发送到窗口并尽快返回, 返回的速度取决于该窗口是否是由调用线程所创建
下面我逐条细细说明
CWnd::SendMessage
LRESULT SendMessage( UINT message, WPARAM wParam = 0, LPARAMlParam = 0 );
返回值 : 消息处理的结果;它的值依赖于发送的消息。
参数 : message    指定了要发送的消息。
            wParam    指定了与消息有关的附加信息。
            lParam      指定了与消息有关的附加信息。
说明 :  这个函数向窗口发送指定的消息 。
             SendMessage成员函数直接调用窗口过程并在窗口过程处理了消息以后才返回。
             这与PostMessage成员函数形成对比,该函数将消息放入窗口的消息队列并立即返回。


CWnd::PostMessage
BOOL PostMessage( UINT message, WPARAM wParam = 0, LPARAM lParam =0 );
返回值 : 如果公布了消息,则返回非零值;否则返回0。
参数 :    message    指定了要公布的消息。
               wParam    指定了附加的消息信息。这个参数的内容依赖于要公布的消息。
               lParam     指定了附加的消息信息。这个参数的内容依赖于要公布的消息。
说明 : 这个函数将一个消息放入窗口的消息队列,然后直接返回,并不等待对应的窗口处理消息。
           消息队列中的消息是通过调用Windows的GetMessage或PeekMessage函数来获得的。可以通过Windows的PostMessage函数来访问其它应用程序。


CWnd::SendNotifyMessage
BOOL SendNotifyMessage( UINT message, WPARAM wParam, LPARAMlParam );
返回值  : 如果函数成功,则返回非零值;否则返回0。
参数 :     message    指定了要发送的消息。
                wParam    指定了与消息有关的附加信息。
                lParam      指定了与消息有关的附加信息。
说明 : 这个函数向窗口发送指定的消息。
            如果窗口是由调用线程创建的,则SendNotifyMessage调用窗口的窗口过程,并在窗口处理了消息之后返回。如果窗口是由其它线程创建的,则SendNotifyMessage将消息传递给窗口过程并立即返回;它并不等待窗口过程结束处理消息。


简单总结一下,
    PostMessage只负责将消息放到消息队列中,不确定何时及是否处理
   SendMessage要等到受到消息处理的返回码(DWord类型)后才继续
   PostMessage执行后马上返回
   SendMessage必须等到消息被处理后才会返回。
    SendMessage消息发出后,如不能尽快得到解决响应,则会导致程序的停滞,所以此函数慎用。              
   PostMessage则无此后果,不过你要是使用PostMessage,那你的消息不知道要等到猴年马月才能被处理。SendMessage可以保证你的消息在得不到处理的情况下谁也别想动你的窗口。
     无论是PostMessage还是SendMessage均由主线程处理。
Windows的线程有UI(用户接口)线程和工作线程,一般工作线程没有自己的消息循环,而UI(用户接口)线程有自己的消息循环。
    所以一般主线程应该是UI(用户接口)线程,其余的处理特定任务的线程都是工作线程,它们把消息发给主线程,由主线程的消息处理函数处理。
SendMessage是阻塞的,它要等到主线程处理完消息后才返回的。
而PostMessage是非阻塞的,调用之后,立即返回,而没有去关心主线程又没有处理这个消息。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值