码迷,mamicode.com
首页 > 其他好文 > 详细

SendMessage与PostMessage

时间:2014-05-29 12:14:59      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:c   style   blog   http   a   width   

《windows核心编程》第26章详细的分析了窗口消息,让人豁然开朗。

 

学习小结:

1、消息队列分为Post消息队列、Send消息队列、虚拟输入消息队列和应答消息队列。

2、PostMessage是将消息发送到消息的线程队列然后返回。

3、SendMessage表面看是发送消息,等消息处理完毕后返回。实际上相对复杂一些,要分情况讨论:

    1)线程内SendMessage,是直接调用窗口消息处理子过程。类似函数调用。
    2)线程间SendMessage,消息会发送到消息处理线程的Send消息队列,发送线程等待结果。
        a) 消息处理函数可以通过ReplyMessage()提前回应发送线程
        b) 消息循环处理消息时,Send消息队列优先于Post消息队列
        c) 调用InSendMessage()可以判定是否线程间Send过来的消息,TRUE表示线程间Send过来的消息,FALSE表示是Post过来的消息或本线程内的Send消息

 

 

写个示例在消息处理函数处打上断点,可以从堆栈窗口上看到这些过程。

 

1、Post消息走的是Post消息队列

bubuko.com,布布扣

 

2、主线程内调用SendMessage和消息处理函数是在一个栈上。

bubuko.com,布布扣

 

3、其他线程调用的SendMessage是发送消息到处理线程的Send消息队列,由处理线程走消息循环处理。

bubuko.com,布布扣

 

Send消息队列优先于Post消息队列,不能直接从堆栈看出。
可如下处理:
1)在消息响应函数中输出日志,在post消息响应中sleep个2秒。
2)在主线程连续post 5次消息,在开5个辅助线程,线程函数中连续SendMessage 5次。
查看执行结果,能看到连续的SendMessage穿插在Post之间处理。得证。

 

SendMessage与PostMessage,布布扣,bubuko.com

SendMessage与PostMessage

标签:c   style   blog   http   a   width   

原文地址:http://www.cnblogs.com/shokey520/p/3756571.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!