我在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
{
}
}
我通过以下步骤调试程序:
这让我感到困惑的是:在第3步,因为我接下来什么也没做,“主线程”暂时暂停;但在第4步中,“主线程”将继续执行。
请帮我解释一下,让我感到困惑!
答案 0 :(得分:0)
Windows消息传递是基于事件的系统。您的程序处于循环中,检查消息队列并响应事件。
这意味着当您的程序看起来正在等待您单击消息框上的“确定”按钮时,它仍在监听和响应事件。其中一个事件是OK按钮的BN_CLICKED
,另一个是计时器消息。
如果程序真的暂停,您的程序将无法响应。