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

 

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);
}

posted @ 2006-12-06 20:45  巨巨  阅读(214)  评论(0编辑  收藏  举报