您的位置:首页 > 其它

MFC同步和异步消息

2015-03-04 11:35 155 查看
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源)

 

1. 定义

同步消息: 

消息被处理完,然后才返回。

消息不进消息队列,而是直接查找到该类注册的消息处理函数(WinProc),把消息交给处理函数处理。

 

异步消息: 

消息只管放入消息队列尾部,不管是否被处理,直接返回。

消息放入对列返回后,消息分发函数(Message)分发到这条消息时,这条消息被处理,交给该类注册的消息处理函数(WinProc)处理。

注意:消息队列的长度有限,对列满时,消息会放入对列失败 

 

2. MFC消息函数中:

SendMessage/GetMessage: 同步消息处理函数

PostMessage/PeekMessage: In Message Queue   异步消息处理函数

 

3. 线程:

 a. MFC的窗口实际是单线程的,无论是模态对话框还是非模态,都属于afxGetApp()线程,CWinApp继承自CWinThread

 b. MFC的Timer实现也非多线程的方法,而是通过消息机制实现的

这与1/2并不矛盾,例如,在一个函数中,使用PostMessage发送多个消息,这些消息都被放入到消息队列中,等待这个函数执行完了,这些队列中的消息才会被依次处理。

 

4. GetMessage/PeekMessage消息处理顺序

a. 首先从当前线程消息队列中取消息,取不到了继续下一步

b. 从系统消息对列中取消息,取不到继续下一步

c. 检查是否有需要重绘的范围,有的话产生WM_PAINT消息,并执行,取不到继续下一步

d. 检查WM_TIMER定时消息,发现有到时的,产生WM_TIMER消息,并执行,取不到继续下一步

e. 执行内存管理

f. 结束 GetMessage - 阻塞等待下一条消息到来    PeekMessage - 返回false

(注意:GetMessage收到WM_QUIT消息时退出,返回false)

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: