【问题标题】:Why does AFXMessageBox process other messages first?为什么 AFXMessageBox 会先处理其他消息?
【发布时间】:2016-03-15 15:34:14
【问题描述】:

我有一个基于 MFC 对话框的应用程序,它有一个监视串行端口连接的线程。不过,为了简单起见,这里我只是模拟在此示例中背靠背发送的数据。

如果我调用 Thread2() 它将发布三条消息,并且为了举例,假设所有三条消息都在 TestFunction() 被调用一次之前发布,这 我所看到的,但我认为它不会总是那样发生。在我添加 Afxmessagebox 之前,一切都很好,但之后,事情就变得奇怪了。

#define WM_TEST_MESSAGE WM_USER+9

bool ALERT_USER = true;

BEGIN_MESSAGE_MAP(CMyDlg, CDialogEx)
  ON_MESSAGE(WM_TEST_MESSAGE, TestFunction)
END_MESSAGE_MAP()


// On thread 1
LRESULT CMyDlg::TestFunction(WPARAM ch, LPARAM port)
{
  TRACE("Before AFX\n");

  if (ALERT_USER)
  {
    AfxMessageBox("About to disable alert!");
    ALERT_USER = false;
  }

  TRACE("After AFX\n");

  return 0;
}

// On thread 2
void Thread2()
{
  ::PostMessage(port->m_pOwner->m_hWnd, WM_TEST_MESSAGE, (WPARAM)0, (LPARAM)0);
  ::PostMessage(port->m_pOwner->m_hWnd, WM_TEST_MESSAGE, (WPARAM)0, (LPARAM)0);
  ::PostMessage(port->m_pOwner->m_hWnd, WM_TEST_MESSAGE, (WPARAM)0, (LPARAM)0);
}

这是我希望看到的:

Before AFX
About to disable alert!
After AFX
Before AFX
After AFX
Before AFX
After AFX

这是我实际得到的:

Before AFX
Before AFX
Before AFX
About to disable alert!
After AFX
After AFX
After AFX
About to disable alert!
About to disable alert!

我发现获得所需结果的最佳方法是将 ALERT_USER 设置为 false 的顺序与消息框交换,因此这不是真正的问题。

但是,我真的很想了解发生了什么。单步执行代码,我最好的猜测是 AFXMessageBox 在运行之前会强制所有其他内容通过消息队列。

谁能解释一下 AfxMessageBox 在幕后做了什么?

【问题讨论】:

  • 它是模态的,并泵出一个消息循环。您必须移动 ALERT_USER = false;声明之前调用。

标签: c++ visual-c++ mfc messagebox


【解决方案1】:

当您拨打AfxMessageBox 时,它会进入消息循环,现在WndProc 可以处理新传入的消息。这就是 MFC/Windows 的工作方式——它们一直在等待新消息(除非被阻止)。请注意,使用[Afx]MessageBox 显示消息框不是阻塞操作 - 它宁愿进入消息循环。

Sleep 调用或套接字等待将是阻塞操作。

【讨论】:

    猜你喜欢
    • 2021-06-09
    • 1970-01-01
    • 2014-11-12
    • 2010-11-24
    • 2019-11-10
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 2015-08-06
    相关资源
    最近更新 更多