您的位置:首页 > 其它

单线程程序处理消息的方式!

2006-12-06 20:45 148 查看
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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐