(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源)
同步消息:
消息被处理完,然后才返回。
消息不进消息队列,而是直接查找到该类注册的消息处理函数(WinProc),把消息交给处理函数处理。
异步消息:
消息只管放入消息队列尾部,不管是否被处理,直接返回。
消息放入对列返回后,消息分发函数(Message)分发到这条消息时,这条消息被处理,交给该类注册的消息处理函数(WinProc)处理。
注意:消息队列的长度有限,对列满时,消息会放入对列失败
SendMessage/GetMessage: 同步消息处理函数
PostMessage/PeekMessage: In Message Queue 异步消息处理函数
a. MFC的窗口实际是单线程的,无论是模态对话框还是非模态,都属于afxGetApp()线程,CWinApp继承自CWinThread
b. MFC的Timer实现也非多线程的方法,而是通过消息机制实现的
这与1/2并不矛盾,例如,在一个函数中,使用PostMessage发送多个消息,这些消息都被放入到消息队列中,等待这个函数执行完了,这些队列中的消息才会被依次处理。
a. 首先从当前线程消息队列中取消息,取不到了继续下一步
b. 从系统消息对列中取消息,取不到继续下一步
c. 检查是否有需要重绘的范围,有的话产生WM_PAINT消息,并执行,取不到继续下一步
d. 检查WM_TIMER定时消息,发现有到时的,产生WM_TIMER消息,并执行,取不到继续下一步
e. 执行内存管理
f. 结束 GetMessage - 阻塞等待下一条消息到来 PeekMessage - 返回false
(注意:GetMessage收到WM_QUIT消息时退出,返回false)