首页 > 代码库 > SendMessage与PostMessage
SendMessage与PostMessage
《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消息队列
2、主线程内调用SendMessage和消息处理函数是在一个栈上。
3、其他线程调用的SendMessage是发送消息到处理线程的Send消息队列,由处理线程走消息循环处理。
Send消息队列优先于Post消息队列,不能直接从堆栈看出。
可如下处理:
1)在消息响应函数中输出日志,在post消息响应中sleep个2秒。
2)在主线程连续post 5次消息,在开5个辅助线程,线程函数中连续SendMessage 5次。
查看执行结果,能看到连续的SendMessage穿插在Post之间处理。得证。