MFC程序假死与消息处理之PeekMessage()
小弟有个程序,需要执行数千次循环,而且每次循环都要处理大量的读数据和筛选数据,因此比较消耗CPU和内存。在程序运行过程中,一旦做其他的任何操作,如按键盘,或者鼠标单击或试...
小弟有个程序,需要执行数千次循环,而且每次循环都要处理大量的读数据和筛选数据,因此比较消耗CPU和内存。
在程序运行过程中,一旦做其他的任何操作,如按键盘,或者鼠标单击或试图拖动对话框到任何地方,该程序就会假死,对话框除了标题栏外就白屏了。
而程序运行结束后,假死状态也就恢复正常了。
后来打听在循环过程中添加PeekMessage()函数来处理消息:
MSG msg;
while(::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
虽然问题解决了,但PeekMessage背后的内幕却还是一头雾水。MFC默认的从消息队列提取消息的应该是GetMessage函数。
所以想知道消息队列中有哪些消息,二者是如何分别对待的都不知道,恳求高人们指点……感激不尽啊!最好能给个办法查看消息队列中具体存在哪些消息,以及当前在处理哪个消息。 展开
在程序运行过程中,一旦做其他的任何操作,如按键盘,或者鼠标单击或试图拖动对话框到任何地方,该程序就会假死,对话框除了标题栏外就白屏了。
而程序运行结束后,假死状态也就恢复正常了。
后来打听在循环过程中添加PeekMessage()函数来处理消息:
MSG msg;
while(::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
虽然问题解决了,但PeekMessage背后的内幕却还是一头雾水。MFC默认的从消息队列提取消息的应该是GetMessage函数。
所以想知道消息队列中有哪些消息,二者是如何分别对待的都不知道,恳求高人们指点……感激不尽啊!最好能给个办法查看消息队列中具体存在哪些消息,以及当前在处理哪个消息。 展开
2011-03-17
展开全部
peek是非阻塞的 get会阻塞 ,需要等待返回,如果用get由于你算法占用了主线程,会一直等待返回,自然无法处理 界面消息,额peek只取消息 不等待返回,所以可以继续处理 界面更新消息,为了符合十分之一秒原则,建议你将算法在线开的线程中处理
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你这么些能行吗?
我怎么感觉有点问题啊。
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()会阻塞直到能够获取消息为止。
我怎么感觉有点问题啊。
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()会阻塞直到能够获取消息为止。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询