zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    转换方法
    数组去重
    js常见兼容
    封装cookie
    常用函数封装
    手绘 代码
    Python变量和数据类型,类型转换
    语句块的概念及注释符的使用
    ipython和pip,模块安装方法
    第一个python程序
  • 原文地址:https://www.cnblogs.com/love6tao/p/6867871.html
Copyright © 2011-2022 走看看