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

在一个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() 消息响应函数中能完成什么功能?


holdtom
浏览 309回答 3
3回答

富国沪深

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);}那就可以从消息队列处理消息,那就不会阻塞程序正常运行,否则,如楼上所说,假死状态。

墨色风雨

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

互换的青春

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);}那就可以从消息队列处理消息,那就不会阻塞程序正常运行。
打开App,查看更多内容
随时随地看视频慕课网APP