MFC程序假死与消息处理之PeekMessage()

小弟有个程序,需要执行数千次循环,而且每次循环都要处理大量的读数据和筛选数据,因此比较消耗CPU和内存。在程序运行过程中,一旦做其他的任何操作,如按键盘,或者鼠标单击或试... 小弟有个程序,需要执行数千次循环,而且每次循环都要处理大量的读数据和筛选数据,因此比较消耗CPU和内存。
在程序运行过程中,一旦做其他的任何操作,如按键盘,或者鼠标单击或试图拖动对话框到任何地方,该程序就会假死,对话框除了标题栏外就白屏了。
而程序运行结束后,假死状态也就恢复正常了。
后来打听在循环过程中添加PeekMessage()函数来处理消息:
MSG msg;
while(::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
虽然问题解决了,但PeekMessage背后的内幕却还是一头雾水。MFC默认的从消息队列提取消息的应该是GetMessage函数。
所以想知道消息队列中有哪些消息,二者是如何分别对待的都不知道,恳求高人们指点……感激不尽啊!最好能给个办法查看消息队列中具体存在哪些消息,以及当前在处理哪个消息。
展开
 我来答
ustbhwg
2011-03-17 · TA获得超过503个赞
知道小有建树答主
回答量:189
采纳率:100%
帮助的人:67.5万
展开全部
消息来源有硬件或者软件,硬件包括键盘、鼠标等输入设备,软件可以是别人发送来的消息。
所有的消息由程序主窗体先接收,接收消息是程序的界面线程完成的,他不断接收,并处理消息,如果你在处理消息的时候耗时很长,他就没时间去接收新的消息,界面就处于“假死”状态,如果加上那几行代码,就可以在耗时过程中继续取得消息,这样界面就不会假死了。
有人喜欢叫消息泵,假死光干你的消息处理函数泵不抽水了,PeekMessage就是实现边干消息处理函数,边抽水。
匿名用户
2011-03-17
展开全部
peek是非阻塞的 get会阻塞 ,需要等待返回,如果用get由于你算法占用了主线程,会一直等待返回,自然无法处理 界面消息,额peek只取消息 不等待返回,所以可以继续处理 界面更新消息,为了符合十分之一秒原则,建议你将算法在线开的线程中处理
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ghos丶t
推荐于2016-10-04 · TA获得超过225个赞
知道小有建树答主
回答量:267
采纳率:0%
帮助的人:0
展开全部
你这么些能行吗?
我怎么感觉有点问题啊。
peekmessage的时候,如果消息队列里面没有消息的时候
peek不到message,所以会返回false,
然后while退出。。。。。
还是我自己理解错误了?
peekmessage 不是传递了一个remove吗,即使peekmessage之后,从消息队列里面删除消息啊。
peekmessage和getmessage的区别是:
peekmessage的时候,如果消息队列为空,peekmessage会返回0即false,
If a message is available, the return value is nonzero.
If no messages are available, the return value is zero.
但是getmessage()会阻塞直到能够获取消息为止。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式