单线程程序处理消息的方式!
原文:http://www.cnblogs.com/jh0262/archive/2006/12/06/2946856.html
MFC内部代码是:
MSG message;
while(::GetMessage(&message,NULL,0,0))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}
当有消息需要处理的时侯,GetMessage返回,如果没有投递任何消息,则程序挂起,可运行其它程序 。当消息最终到达的时侯,程序被唤起。TranslateMessage函数可以将WM_KEYDOWN消息转换为WM_CHAR;DispatchMessage函数将控件传递给MFC消息转储,由转储来通过消息映射来调用函数。
当应用程序需要运行的时间很长的时侯,就需要在应用程序的虚幻中插入下面的程序段:
MSG message;
while(::PeekMessage(&message,NULL,0,0,PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}
这样慢应用程序仍然在运行,不过如果有了消息,它将暂停,调用处理程序,在处理程序退出,慢应用程序继续运行。
void CComputeDLG::OnStrat()
{
// TODO: Add your control notification handler code here
MSG message;
m_nTimer=SetTimer(1,100,NULL);
//ASSERT(m_nTimer!=0);
GetDlgItem(IDC_START)->EnableWindow(FALSE);
volatile int nTemp;
for(m_nCount=0;m_nCount<nMaxCount;m_nCount++)
{
for(nTemp=0;nTemp<100000;nTemp++)
{//这里什么也没有做,空循环
}
if(::PeekMessage(&message,NULL,0,0,PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}//这里当有消息时,暂停执行,转入消息处理,本程序采用的WM_TIMER消息
}
CDialog::OnOK();
}
void CComputeDLG::OnCancel()
{
// TODO: Add extra cleanup here
if(m_nCount==0)
{
CDialog::OnCancel();
}
else
{
m_nCount=nMaxCount;
}
}
void CComputeDLG::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if(nIDEvent==1)
{//设置进度条的进度。
CProgressCtrl* pBar=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
pBar->SetRange(0,100);
pBar->SetPos(m_nCount*100/nMaxCount);
}
CDialog::OnTimer(nIDEvent);
}