为了账号安全,请及时绑定邮箱和手机立即绑定

您好,请问在MFC中ProcessMessage()函数有什么作用?

您好,请问在MFC中ProcessMessage()函数有什么作用?

holdtom 2022-01-21 15:11:47
在一个SDI应用程序中,有一个按钮的消息响应函数里有下列代码:void CSXS_testView::OnCapContinue() {……………………while(stateRunning){//执行测量操作//进行数据处理采集sxSystem.process();//处理消息队列ProcessMessage();//更新窗口画面Invalidate();CTools::delayMsMessage(50);}……………………}其中,ProcessMessage()的定义为void CSXS_testView::ProcessMessage(){//消息变量MSG msg; if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){ TranslateMessage (&msg); DispatchMessage (&msg); }}我想知道ProcessMessage()是干什么用的,它在OnCapContinue() 消息响应函数中能完成什么功能?
查看完整描述

3 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

MFC SDI执行顺序大致是:AfxWinMain在WinMain这个程序入口点被调用,有个全局对象是theApp,它类型为你工程中派生自CWinApp的派生类类型。AfxWinMain调用其成员函数,初始化、然后创建窗口(CMainFrm),然后进入Run,在Run里
while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
//调用窗口对应的消息处理函数
TranslateMessage (&msg);
DispatchMessage (&msg);
}
而这个PeekMessage是从当前线程的消息队列获取消息。你程序中如果使用PostMessage则可以把消息放入消息队列,但是要等待上一条消息被处理完,如果使用SendMessage,就不用放入消息队列,直接响应,而MFC内部控制界面,如你的Invalidate();会PostMesage ,所以,你当前函数没退出,那就不能响应消息,于是,如果你在循环时
MSG msg;
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage (&msg);
DispatchMessage (&msg);}

那就可以从消息队列处理消息,那就不会阻塞程序正常运行,否则,如楼上所说,假死状态。



查看完整回答
反对 回复 2022-01-23
?
墨色风雨

TA贡献1853条经验 获得超6个赞

//处理消息队列
ProcessMessage();

注释中已经说的很明白了。在大的或者耗时较长的循环处理中,程序会不响应消息队列,这时候,程序界面不会刷新,点击也没有反应(死机状),如果要避免这种情况,就需要在循环中适当(也许每次循环,也许几次循环处理一次)通过手动代码响应和处理消息队列,这就是它的功能和作用。

查看完整回答
反对 回复 2022-01-23
?
互换的青春

TA贡献1797条经验 获得超6个赞

while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
//调用窗口对应的消息处理函数
TranslateMessage (&msg);
DispatchMessage (&msg);
}
而这个PeekMessage是从当前线程的消息队列获取消息。你程序中如果使用PostMessage则可以把消息放入消息队列,但是要等待上一条消息被处理完,如果使用SendMessage,就不用放入消息队列,直接响应,而MFC内部控制界面,如你的Invalidate();会PostMesage ,所以,你当前函数没退出,那就不能响应消息,于是,如果你在循环时
MSG msg;
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage (&msg);
DispatchMessage (&msg);}

那就可以从消息队列处理消息,那就不会阻塞程序正常运行。



查看完整回答
反对 回复 2022-01-23
  • 3 回答
  • 0 关注
  • 308 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信