博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SendMessage与PostMessage的区别(转)
阅读量:4517 次
发布时间:2019-06-08

本文共 1057 字,大约阅读时间需要 3 分钟。

 

在做基于窗口的Windows程序的时候,我们避免不了要向窗口发送消息,有两种方式,一种是PostMessage,另外一种是SendMessage。关于这两个宏,我是通过狠狠的看MSDN才搞明白的,那里讲的是最权威的。它们的区别如下:

1、PostMessage会将消息压入窗口所在线程的消息队列,然后返回;而SendMessage则不经过消息队列,SendMessage可认为是直接调用了该窗口的窗口过程,因此在我们需要获得消息处理后的返回值的时候,就要用到SendMessage。

    例如:当在程序中指定如下使用:PostMessage(hWnd, WM_MSG,0,0),那么当程序执行到PostMessage的时候,仅将消息WM_MSG压入到创建hWnd所指窗口的那个线程的消息队列,然后程序将继续执行下去,而至于程序什么时候响应该消息,则要看那个线程什么时候得到控制权;

    而指定如下使用:SendMessage(hWnd, WM_MSG,0,0),那么当程序执行到该处时,将发生一次跳转:从当前位置,跳转到hWnd的窗口过程中去响应WM_MSG消息,当消息处理结束,窗口过程返回,程序又将从SendMessage后面继续执行,当然,我们可以获得窗口过程对该消息的处理结果,也即取SendMessage的返回值。(这里只是针对单线程)。

2、在多线程应用中,PostMessage的用法还是一样,但SendMessage则不同了。如果在线程A中向线程B所创建的一个窗口hWndB发送消息SendMessage(hWndB,WM_MSG,0,0),那么系统将会立即将执行权从线程A切换到线程B,然后在线程B中调用hWndB的窗口过程来处理消息,并且在处理完该消息后,执行权仍然在B手中!这个时候,线程A则暂停在SendMessage处,等待下次线程A获得执行权后才继续执行,并且仍然可以获得消息处理的结果(返回值)。一般,为了避免死锁,在B中对WM_MSG做出处理之前,要加上:
      if(InSendMessage())

       RelpyMessage(lResult);

 

转自:

即判断:如果该消息是发自另外一个线程,则立即 RelpyMessage,回复消息,参数lResult即是返回值。而如果是在同一个线程内,则InSendMessage()将会返回FALSE。

转载于:https://www.cnblogs.com/wb118115/archive/2012/06/15/2550304.html

你可能感兴趣的文章
ab测试
查看>>
AndroidStudio开发环境安装及配置
查看>>
[haoi2011]向量
查看>>
常见概率分布图表总结
查看>>
Ubuntu的 g++ gcc版本升降级
查看>>
判断程序是否已经运行
查看>>
SQL http://www.myfeng.cn/?T3009
查看>>
傻瓜式硬盘重装win7系统图文加视频教程
查看>>
BZOJ 1607 [Usaco2008 Dec]Patting Heads 轻拍牛头:统计 + 筛法【调和级数】
查看>>
樱花漫地集于我心,蝶舞纷飞祈愿相随---总结 适者:survival of the fittest 适者:survival of the fittest...
查看>>
joson返回数据库的时间格式在前台用js转换
查看>>
Software--IoC 依赖倒置 控制反转
查看>>
java集合的方法及使用详解
查看>>
hdu 5101(思路题)
查看>>
React学习笔记 - 组件&Props
查看>>
IOS 之PickView
查看>>
error LNK2005:错误改正方法
查看>>
centos 安装tmux
查看>>
OpenLayers使用symbolizers样式特征
查看>>
C# MD5 加密算法
查看>>