MsgWaitForMultipleObjects + TranslateMessage 调用时要小心。

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

 

出错的程序片段如下:(摘自:http://blog.csdn.net/stwstw0123/archive/2010/10/11/5934161.aspx

 

错误原因:

1.在MFC框架下,TranslateMessage之前,没有调用PreTranslateMessage。

2.如果在子模块中出现此代码的话,就相当于把消息循环的处理转移到该子模块中了(虽然只是暂时的)。这时候,如果调用了PostMessage给某个窗口,而该窗口在处理这个个消息的时候,把该子模块给FreeLibrary了,该子模块的TranslateMessage函数返回后,在想继续执行就出错了(不要说不肯能哦,这也是本人在具体项目中遇到过的错误)。在vc6.0中调试,出现如下错误:

 

也就是一段代码释放本身所在的模块产生的错误。例如,在FreeLibrary.dll中有个导出函数如下:

 

在其他模块中调用,如下:

就产生同样的错误。

 

 

Policy-based design在嵌入式网络管理中的编译期解耦实践 Policy-based design是一种基于模板的编译期策略组合技术,其核心原理是通过空基类优化(EBO)与静态接口契约,实现零运行开销的行为分离。相比Strategy Pattern等运行多态方案,它在资源受限环境(如Windows Mobile、IoT终端、Rust嵌入式驱动)中显著降低内存占用、提升序确定性,并支持SFINAE等编译期约束。该技术的价值在于将变化维度(如连接方式、重试逻辑、网络探测)解耦为独立可测试单元,广泛应用于工业通信模块、电力巡检终端、政企专网设备等对稳定性与启动性能要 阅读详情

相关推荐

Windows 应用偶现界面卡死问题的分析

我们开发的应用,在 Windows 平台上偶尔会卡死,不再响应任何鼠标事件。这样的现象不太容易出现,操作一天可能会出现一次。 在经过无数次重启应用,复现问题,断点调试,终于发现了一点端倪,并在各种排除法隔离一部分功能试验后,终于找到了罪魁祸首——一个几乎可以忽略的不合理参数。 特地在此记录一下,希望能够在某个候帮助到某个同路人。 问题背景 首先,说明一下相关的软件背景。 我们使用的是一个第三方封装的 GUI 库,封装了 Windows 的窗口、窗口消息、GDI 等功能。这个库不是 Qt,而是一个

luansxx的专栏 2370

[转]WaitForMultipleObjectMsgWaitForMultipleObjects用法

用户模式的线程同步机制效率高,如果需要考虑线程同步问题,应该首先考虑用户模式的线程同步方法。 但是,用户模式的线程同步有限制,对于多个进程之间的线程同步,用户模式的线程同步方法无能为力。这,只能考虑使用内核模式。 用户模式与内核模式线程同步机制比较: 用户模式 内核模式 优点 线程同步机...

weixin_30892763的博客 425

MsgWaitForMultipleObjectsEx用法

MsgWaitForMultipleObjectsEx用法 函数功能描述:阻塞仍可以响应消息返回的线程同步API 函数原型 DWORD MsgWaitForMultipleObjectsEx( DWORDnCount, // 句柄数组中句柄数目 LPHANDLEpHandles, // 指向句柄数组的指针 DWORD...

weixin_34342207的博客 665

MFC】主线程等待子线程退出函数(MsgWaitForMultipleObjects

01、目录 目录01、目录02、函数介绍2.1 函数创建2.2 函数返回值2.3 函数使用事项03、示例04、小结 02、函数介绍 MsgWaitForMultipleObjects 功能:阻塞仍可以响应消息,“对象被激发”或“消息到达队列”被唤醒而返回 相关API:WaitForMultipleObjects(),此API接收到消息后不会被唤醒和返回。 MsgWaitForMultipleObjects()多接收一个参数,允许指定哪些消息是观察对象。 2.1 函数创建 DWORD MsgWait

Cain Xcy的博客 2519

MFC多线程编程注意事项

     1.工作线程给主线程发消息使用的是SendMessage和PoseMessage函数。这两个函数的区别在于SendMessage函数是阻塞方式,而PoseMessage函数是非阻塞方式。如果不是严格要求工作线程与主线程必须同步执行,则推荐使用PoseMessage。     2.不要在线程函数体内操作MFC控件,因为每个线程都有自己的线程模块状态映射表,在一个线程中操作另一个线程中创

nefeithu123的专栏 2973

WaitForMultipleObjectMsgWaitForMultipleObjects用法

WaitForSingleObject、WaitForMultipleObjectMsgWaitForMultipleObjectsMsgWaitForMultipleObjectsEx使用方法

深之JohnChen的专栏 9536

MFC】 使用MsgWaitForMultipleObjects解决后台线程退出SendMessage响应问题

问题 某些MFC后台线程可能在主程序退出仍然处于工作状态。主程序退出前,一般需要等待后台线程先退出。处理这类问题的机制通常是,主程序在OnClose()函数中通过激活事件通知后台线程退出。 在这种情况下,后台线程退出调用SendMessage()函数发送消息,主程序已不能响应。因为,此主程序进入OnClose()函数后,消息响应机制已经关闭。 使用WaitForSingleObject...

sunriver2000的专栏 1624

MFC 线程同步MsgWaitForMultipleObjects Function

1、作用 等待,直到一个或所有指定的对象处于信号状态或超间隔过去。这些对象可以包括输入事件对象,您可以使用dwWakeMask参数指定这些对象。 2、函数原型 DWORD MsgWaitForMultipleObjects( [in] DWORD nCount, [in] const HANDLE *pHandles, [in] BOOL fWaitAll, [in] DWORD dwMilliseconds, [in] DWORD

qq_47999510的博客 793

MsgWaitForMultipleObjects 后遗症 与解决办法

调用SendMessage 产生死锁的问题分析 之后,我在界面程序中不再使用 WaitForSingleObject 了,而改用如下的函数 DWORD WaitObjectAndMsg(HANDLE hEventThread, DWORD dwMilliseconds) { BOOL bWait = TRUE; DWORD dwEvt = 0; while(bWait)

王伟挺的专栏 1万+

WaitForMultipleObjectsEx最后一个参数的用途

针对于WaitForMultipleObjectsEx最后一个参数的用途,有如下,异步文件操作实例: 利用ReadFileEx/WriteFileEx,这对函数使用回调函数来进行读写完成的通知。 BOOL ReadFileEx(   HANDLE hFile,                                       // handle to file   LPVOI

liu4030127的专栏 3031

Windbg在软件调试中的应用

Windbg在软件调试中的应用                                                          Windbg是微软提供的一款免费的,专门针对Windows应用程序的调试工具。借助于Windbg, 我们常见的软件问题:软件异常,死锁,内存泄漏等,就可以进行高效的排查。 在开始用WinDbg调试应用程序之前,我们得先做些准备工作。 1.设置符号

崔伟灿的博客 1484

线程同步之Win32API的Wait函数

线程同步之Win32API的Wait函数Win32API中的Wait函数非常重要,很多同步都需要Wait函数的配合,Wait函数很多,常用的我就不赘述了,只对一些有用但不常用的函数做一些描述。1.WaitForSingleObject最常用的函数,不用多说了。对于信号灯和信号量,每用一次,信号量减一。DWORD WaitForSingleObject( HANDLE

amd k_7的专栏 4121

调试挂死的Explorer

 一个同事前几天告诉我说,他的explorer.exe总是挂死,不知道是什么情况导致的。于是我让他下次挂死的候抓个dump我。抓Dump的工具很多,例如用Win7的TaskMgr,sysinternals的Procexp,或者Windbg本身。不过考虑到explorer挂死了,操作桌面起来不方便,所以最好选择能够自动检测挂死并且抓住dump的工具。这里比较推荐的是sysinternals的

xiliang_pan的专栏 3132

C++ 多线程阻塞 (多线程同步)(MsgWaitForMultipleObjects

在主线程定要禁止使用waitforsingleobject(),原因是会阻塞主线程的消息循环,所以必须使用另一种 MsgWaitForMultipleObjects,即可以让消息通过,下面就是一个基于MsgWaitForMultipleObjects与Event,实现多线程同步这样。HANDLE g_Handle;//全局的句柄g_Handle=CreateEvent(NULL,FALSE,F

小乌龟的博客 3669

在用户线程/主线程中推荐MsgWaitForMultipleObjects代替WaitForSingleObject和WaitForMultipleObjects()函数

多线程同步,采用WaitForSingleObject和WaitForMultipleObjects()函数出现卡死现象,采用MsgWaitForMultipleObjects代替可以解决此类问题。

cbNotes的专栏:不积硅步,无以至千里;不积小流,无以成江海! 7859
上一篇: MFC中关于各种状态的分析 : module state, thread state, process state.
下一篇: vector的iterator的错误使用
begges
博客等级 码龄20年 6粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值