处理MFC中的消息

时间:2014-12-18 15:38:24

标签: multithreading timer mfc

我在MFC中创建了一个关于CDialog和Timer的简单程序。

我遇到的问题,我认为这很正常,但我无法解释MFC如何在一个或多个线程中处理消息。

程序的主要源代码:

BOOL CMyDlg::OnInitDialog()
{
     CDialog::OnInitDialog();
     ...
     SetTimer(1, 10000, NULL);

     return TRUE;
}
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
    ON_WM_TIMER()
    ON_BN_CLICKED(IDC_BTN_START, OnBtnStartClicked)
END_MESSAGE_MAP()

void CMyDlg::OnBtnStartClicked()
{
    DisplayMessage(1);
}

void CMyDlg::OnTimer(UINT nIDTimer)
{
     if (nIDTimer == 1)
     {
         KillTimer(1);
         DisplayMessage(2);
         SetTimer(1, 10000, NULL);
     }
}

void CMyDlg::DisplayMessage(INT nID)
{
    if (nID == 1)
    {
        AfxMessageBox(_T("Button Clicked"));
    }
    else if (nID == 2)
    {
        AfxMessageBox(_T("Timer timeout"));
    }
    else
    {
    }
}

我通过以下步骤调试程序:

  1. 在两个函数中设置断点:OnBtnStartClicked()和OnTimer()并以调试模式运行。
  2. 单击“开始”按钮,Visual Studio的指针在OnBtnStartClicked()中停止。打开线程窗口,我看到代码在“主线程”中执行。
  3. 按F5继续。将显示一个消息框。我接下来什么都不做。
  4. 在接下来的几秒钟内,VS的指针停在OnTimer()中。我还在Thread窗口中看到代码也在“Main Thread”中执行。
  5. 按F5继续。第二个消息框显示。
  6. 这让我感到困惑的是:在第3步,因为我接下来什么也没做,“主线程”暂时暂停;但在第4步中,“主线程”将继续执行。

    请帮我解释一下,让我感到困惑!

1 个答案:

答案 0 :(得分:0)

Windows消息传递是基于事件的系统。您的程序处于循环中,检查消息队列并响应事件。

这意味着当您的程序看起来正在等待您单击消息框上的“确定”按钮时,它仍在监听和响应事件。其中一个事件是OK按钮的BN_CLICKED,另一个是计时器消息。

如果程序真的暂停,您的程序将无法响应。