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的异同的更多相关文章

  1. 打开属性页,分别在Debug和Release下将其配置类型改为:静态库(.lib);

    右键工程->属性 配置类型里面的下拉菜单选择静态库

  2. vs2010 创建预编译头 Debug 正常 Release Link Error问题解决

    问题:创建预编译头 Debug 正常 Release Link Error Main.obj : error LNK2005: ___@@_PchSym_@00@UmfilkilqUdrmzkkUki ...

  3. (原)Vs中debug和release结果不一致

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5598091.html 前两天调试程序,出现了一个很蛋疼的问题,debug和release结果不一致.网 ...

  4. 盘点.NET JIT在Release下由循环体优化所产生的不确定性Bug

    盘点在Release下由循环体优化所产生的不确定性Bug 在这篇文章中,我将介绍一些在测试环境(DEBUG)下正常,但在生产环境(Release)下却会出现的一些让人难以捉摸的Bug. 如果你对开源技 ...

  5. VC下Debug和Release区别

    整理日: 2015年3月23日 最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下又无法进行调试,于是只能采用printf方式逐步定位到 ...

  6. 在用VC编译下debug和release的什么区别

    DEBUG和RELEASE 版本差异及调试相关问题:.         内存分配问题 1.          变量未初始化.下面的程序在debug中运行的很好. thing * search(thin ...

  7. Objective-C与Swift下的自定义打印函数(Debug和Release)

    1.Objective-C 在使用Objective-C进行开发的过程中,为了Debug会不断的设置打印函数.如下图是我们经常用的,用来测试监听方法的实现与否: NSLog(@"%s&quo ...

  8. Swift打印Debug日志,实现Release下不打印

    OC内,我们往往做log打印时,会考虑一个Debug环境下打印,Release下控制不打印,以节约性能消耗. OC我们可以这样做: 在pch文件内,定义如下: //打印日志 #ifdef DEBUG ...

  9. 如何在 .NET 库的代码中判断当前程序运行在 Debug 下还是 Release 下

    我们经常会使用条件编译符 #if DEBUG 在 Debug 下执行某些特殊代码.但是一旦我们把代码打包成 dll,然后发布给其他小伙伴使用的时候,这样的判断就失效了,因为发布的库是 Release ...

随机推荐

  1. CF 2015 ICL, Finals, Div. 1 J. Ceizenpok’s formula [Lucas定理]

    http://codeforces.com/gym/100633/problem/J Lucas定理P不是质数裸题 #include <iostream> #include <cst ...

  2. GO开发:接口

    接口 接口定义 Interface类型可以定义一组方法,但是这些不需要实现.并且interface不能包含任何变量. type example interface{ Method1(参数列表) 返回值 ...

  3. appium如何切换Native和WebView

    方法一: Set<String>contexts=driver.getContextHandles(); driver.context((String)contexts.toArray() ...

  4. 升级gitlab

    https://gitlab.com/gitlab-org/gitlab-ce/tree/master/doc/update https://about.gitlab.com/update/#cent ...

  5. ios开发常用RGB色值

    iOS中RGB常用的色值,同时可将对颜色的设置定义成宏,方便开发应用,如: // RGB颜色转换(16进制->10进制) #define UIColorFromRGB(rgbValue) [UI ...

  6. unity爬坑记录

    这里记一下平时遇到的unity bug: unity2017最好不要在prefab上面修改它上面的组件参数 最好是拖放到场景之后修改场景内的物体组件参数 完事了apply一下删掉 不这样做的话 可能u ...

  7. cygwin + git + nat123 30元搭建公网可访问的git服务器

    首先参考上一篇安装服务器上的CYGWIN: http://jingyan.baidu.com/article/7e440953eabd742fc0e2efae.html 上一篇中已经加入了GIT相关的 ...

  8. Ansible playbook循环实践总结<一>

    1.标准Loops 标准loops可以直接减少task的次数,如下: [root@zero01 playbook]# vi loops.yaml --- - hosts: all gather_fac ...

  9. WinForm中ClickOnce发布至广域网

    ClickOnce智能客户端,是微软提供比较早的一项技术,用于实现WinForm开发的应用程序能够自动更新,省去给每台客户端升级带来的困扰. 从网上的贴子里看,有的说好用,有的说不好用.客观的说,微软 ...

  10. 机器学习之支持向量机(三):核函数和KKT条件的理解

    注:关于支持向量机系列文章是借鉴大神的神作,加以自己的理解写成的:若对原作者有损请告知,我会及时处理.转载请标明来源. 序: 我在支持向量机系列中主要讲支持向量机的公式推导,第一部分讲到推出拉格朗日对 ...