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

04-14 04:29