MFC同步和异步消息
2015-03-04 11:35
155 查看
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源)
消息被处理完,然后才返回。
消息不进消息队列,而是直接查找到该类注册的消息处理函数(WinProc),把消息交给处理函数处理。
异步消息:
消息只管放入消息队列尾部,不管是否被处理,直接返回。
消息放入对列返回后,消息分发函数(Message)分发到这条消息时,这条消息被处理,交给该类注册的消息处理函数(WinProc)处理。
注意:消息队列的长度有限,对列满时,消息会放入对列失败
PostMessage/PeekMessage: In Message Queue 异步消息处理函数
b. MFC的Timer实现也非多线程的方法,而是通过消息机制实现的
这与1/2并不矛盾,例如,在一个函数中,使用PostMessage发送多个消息,这些消息都被放入到消息队列中,等待这个函数执行完了,这些队列中的消息才会被依次处理。
b. 从系统消息对列中取消息,取不到继续下一步
c. 检查是否有需要重绘的范围,有的话产生WM_PAINT消息,并执行,取不到继续下一步
d. 检查WM_TIMER定时消息,发现有到时的,产生WM_TIMER消息,并执行,取不到继续下一步
e. 执行内存管理
f. 结束 GetMessage - 阻塞等待下一条消息到来 PeekMessage - 返回false
(注意:GetMessage收到WM_QUIT消息时退出,返回false)
1. 定义
同步消息:消息被处理完,然后才返回。
消息不进消息队列,而是直接查找到该类注册的消息处理函数(WinProc),把消息交给处理函数处理。
异步消息:
消息只管放入消息队列尾部,不管是否被处理,直接返回。
消息放入对列返回后,消息分发函数(Message)分发到这条消息时,这条消息被处理,交给该类注册的消息处理函数(WinProc)处理。
注意:消息队列的长度有限,对列满时,消息会放入对列失败
2. MFC消息函数中:
SendMessage/GetMessage: 同步消息处理函数PostMessage/PeekMessage: In Message Queue 异步消息处理函数
3. 线程:
a. MFC的窗口实际是单线程的,无论是模态对话框还是非模态,都属于afxGetApp()线程,CWinApp继承自CWinThreadb. 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)
相关文章推荐
- MFC发送消息函数PostMessage(异步)和SendMessage(同步)的异同
- UML建模中简单消息、同步消息和异步消息
- JMS 中消息的 同步消费 和 异步消费(listener的方式)
- 循序渐进做项目系列(2):最简单的C/S程序——消息异步调用与消息同步调用
- MSMQ(3)创建、同步异步接收消息
- 同步消息处理,异步变同步处理
- 同步和异步消息机制
- 回调函数,同步调用,异步调用,事件,消息循环
- 同步/异步与阻塞/非阻塞的区别消息
- ActiveMQ消息的同步和异步
- 回调函数,同步调用,异步调用,事件,消息循环
- 同步和异步关注的是消息通信机制,阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态
- 同步方式的消息发送和异步方式的消息发送
- .Net下的MSMQ(微软消息队列)的同步异步调用 (转载)
- mfc 调用Windows的API函数实现同步异步串口通信(源码)
- 消息队列同步和异步机制
- 消息的同步发送,异步发送以及消息发送的可靠性
- Objective-C 编程语言(13)远程消息---Obj-C 对远程消息的支持(同步异步消息)
- JMS异步消息解决分布式应用的EhCache缓存同步问题
- [基础]同步消息和异步消息传递的区别?