debug和release下PostThreadMessage的異同
MFC中創建線程分為工作線程和UI線程。其中UI線程可以通過繼承CWinThread進行創建。
創建函數如下:
CWinThread *m_pRecogThread;//語音識別線程
m_pRecogThread =(CSpeechRecogThread *) AfxBeginThread(RUNTIME_CLASS(CSpeechRecogThread));
這樣就創建了UI線程,就可以通過m_pRecogThread->PostThreadMessage(UM_VERIFY_AVAILABILITY,NULL,NULL),給當前線程發送消息。
然而,PostThreadMessage缺常常會出問題。在debug下,上述代碼能夠正確執行,而debug下不能正確執行。
我們執行下面代碼捕捉錯誤,
DWORD dw; dw = GetLastError(); CString str; str.Format("%u",dw);
正常情況下,返回的應該是0,而錯誤的時候返回的是1444.
百度後發現,1444 PostThreadMessage 這種錯誤是因為線程沒有創建消息隊列,可以通過延時解決。以下是代碼:
while(!m_pRecogThread->PostThreadMessage(UM_VERIFY_AVAILABILITY,NULL,NULL))
{
Sleep(1000);
}
但是上述代碼在release模式下沒有任何變化。
百度了好久,找到一個鏈接MFC‘s CWinThread::PostThreadMessage handler not called .PostThreadMessage沒有被調用。
可以通過在該線程InitInstance函數中,調用PeekMessage解決。具體的步驟就是在InitInstance函數中加入如下代碼。
AfxOleInit();
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
MSG msg;
PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
到處,問題被完整解決:
參考文獻:
1 http://stackoverflow.com/questions/12764300/mfcs-cwinthreadpostthreadmessage-handler-not-called
2 http://www.cppblog.com/sandy/archive/2005/12/31/2320.html
debug和release下PostThreadMessage的異同