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之间处理。得证。
It was the best of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness, it was the epoch of belief, it was the epoch of incredulity. We had everything before us, we had nothing before us.
这是最好的时代,这是最坏的时代;这是智慧的年代,这是愚蠢的年代;这是信仰的时期,这是怀疑的时期;我们的前途拥有一切,我们的前途一无所有。
这是最好的时代,这是最坏的时代;这是智慧的年代,这是愚蠢的年代;这是信仰的时期,这是怀疑的时期;我们的前途拥有一切,我们的前途一无所有。