【发布时间】: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