【发布时间】:2014-12-18 15:38:24
【问题描述】:
我在 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
{
}
}
我通过以下步骤调试程序:
- 在两个函数中设置断点:OnBtnStartClicked() 和 OnTimer() 并在调试模式下运行。
- 单击开始按钮,Visual Studio 的指针停在 OnBtnStartClicked() 中。打开线程窗口,我看到代码在“主线程”中执行。
- 按 F5 继续。将显示一个消息框。接下来我什么也不做。
- 在接下来的几秒钟内,VS 的指针在 OnTimer() 中停止。我还在线程窗口中看到,看到代码也在“主线程”中执行。
- 按 F5 继续。第二个消息框是显示。
让我困惑的是:在第3步中,因为我接下来什么都不做,所以“主线程”暂时暂停;但是在第4步中,“主线程”是连续执行的。
请帮我解释一下,这让我很困惑!
【问题讨论】:
标签: multithreading timer mfc