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


    原文: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);
    }

  • 相关阅读:
    在vm中安装ubuntu 11 并部署 xampp集成环境步骤
    修改xampp的mysql默认密码
    linux下重命名文件的命令
    IE6下DIV最小高度不能为0的解决方法
    linux下解压tar.gz 文件和 tar.bz2 文件命令
    linux svn 使用
    win7 下设置java环境变量
    在linux下安装svn软件rabbitvcs
    linux下开启ssh服务
    【转】DataSet与DataTable的区别
  • 原文地址:https://www.cnblogs.com/lizhigang/p/7151552.html
Copyright © 2020-2023  润新知