【问题标题】:Handle message in MFC在 MFC 中处理消息
【发布时间】: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
    {
    }
}

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

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

让我困惑的是:在第3步中,因为我接下来什么都不做,所以“主线程”暂时暂停;但是在第4步中,“主线程”是连续执行的。

请帮我解释一下,这让我很困惑!

【问题讨论】:

    标签: multithreading timer mfc


    【解决方案1】:

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

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

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

    【讨论】:

    • @MarkRanson:两个函数 OnTimer() 和 OnBtnStartClicked() 在两个线程中执行还是只在一个线程中执行?
    • @quangdien 只有一个线程。最初创建 Windows 时,没有线程!它使用协作多任务处理,其中一个程序运行的唯一方法是让另一个程序在等待消息时暂停。
    • 此外,在窗口过程中接收到的所有消息都在创建窗口的同一线程上——即使消息是从另一个线程发送的。因此,WM_TIMER 和 BN_CLICED 或您处理的任何消息都将在同一个线程上。
    • 我还有一个问题,如果我想同步两条消息(例如:当且仅当用户单击第一个消息框的 OK btn 时才会显示计时器的消息框)。你有什么建议吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多