码迷,mamicode.com
首页 > 其他好文 > 详细

debug和release下PostThreadMessage的异同

时间:2017-05-17 16:08:05      阅读:274      评论:0      收藏:0      [点我收藏+]

标签:lease   archive   http   解决   hand   logs   form   完整   time   

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

标签:lease   archive   http   解决   hand   logs   form   完整   time   

原文地址:http://www.cnblogs.com/love6tao/p/6867871.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!