我有一個基於MFC對話框的應用程序,帶有一個監視串行端口連接的線程。爲了簡單起見,在這裏我只是模擬在這個例子中重複發送的數據。爲什麼AFXMessageBox首先處理其他消息?
如果我調用線程2()將發佈三條消息,例如起見,可以說所有的三個得到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;聲明*在通話之前。 –