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


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

  • 相关阅读:
    pycharm 安装第三方库,出现错误: error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visual studio.com/visual-cpp-build-tools
    c# 开发常用小方法
    [LeetCode]28. 实现 strStr()
    [LeetCode]27. 移除元素
    [LeetCode]21. 合并两个有序链表
    [LeetCode]20. 有效的括号
    [LeetCode]14. 最长公共前缀
    [LeetCode]13. 罗马数字转整数
    [LeetCode]9. 回文数
    [LeetCode]2. 两数相加
  • 原文地址:https://www.cnblogs.com/lizhigang/p/7151552.html
Copyright © 2020-2023  润新知