为什么AFXMessageBox首先处理其他消息

Why does AFXMessageBox process other messages first?

本文关键字:其他 消息 处理 AFXMessageBox 为什么      更新时间:2023-10-16

我有一个基于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 AFXn");
  if (ALERT_USER)
  {
    AfxMessageBox("About to disable alert!");
    ALERT_USER = false;
  }
  TRACE("After AFXn");
  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在幕后做什么?

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

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