1. 程式人生 > >debug和release下PostThreadMessage的異同

debug和release下PostThreadMessage的異同

hand 應該 clas 發現 cst b- cstring 被調用 gin

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的異同