debug和release下PostThreadMessage的异同

Posted mitutao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的异同的主要内容,如果未能解决你的问题,请参考以下文章

Debug和Release区别

debug和release 模式有啥区别

mfc 程序,debug版本正常和release版本异常。

.net 项目在Debug模式下打包跟在release模式下打包有啥区别?

debug和release版本的区别

VC中release和debug版本的区别