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