首页 > 代码库 > 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之间处理。得证。