2016-03-15 110 views
0

我有一個基於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在幕後做?

+1

它是模式和泵消息循環。你必須移動ALERT_USER = false;聲明*在通話之前。 –

回答

0

當您撥打AfxMessageBox時,它會進入消息循環,現在WndProc可以處理新的傳入消息。這就是MFC/Windows的工作原理 - 他們一直在等待新消息(除非被阻止)。請注意,使用[Afx]MessageBox顯示消息框不會阻止操作 - 它寧願進入消息循環。

A Sleep調用或套接字等待將是一個阻塞操作。