|对话框管理器第六章:消息循环中的细节
文章图片
在上一篇文章中 , 我留下了一道课后作业:找到EndManualModalDialog和模态对话框消息循环之间的细微Bug 。
微妙之处在于:EndManualModalDialog会在内部设置了一些标志 , 但没有强制消息循环注意到该标志已实际设置 。 回想一下 , GetMessage函数在投递性消息(Posted Message)到达消息队列之前不会返回 。如果传入的已发送消息到达 , 则将它们传递到相应的窗口过程 , 但GetMessage函数不返回 。它只是不断传递传入的已发送消息 , 直到投递性消息最终到达 。
因此 , Bug是:当你调用EndManualModalDialog时 , 它会设置指示模式消息循环停止运行的标志 , 但不会做任何事情来确保模式消息循环会检测这个标志 。在发布的消息到达之前什么都不会发生 , 这会导致GetMessage返回 。发送消息并重新启动while循环 , 此时代码最终注意到fEnded标志已设置并跳出模式消息循环 。
有几种方法可以解决这个问题 。 比较快速的方法是:发布一条毫无意义的消息 , 如下图所示:
这将强制GetMessage返回 , 因为我们确保队列中至少有一条消息等待处理 。我们选择了 WM_NULL消息 , 因为它什么都不做 。我们对消息的作用不感兴趣 , 只对消息存在的事实感兴趣 。
最后Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一 , 里面有很多关于Windows的小知识 , 对于广大Windows平台开发者来说 , 确实十分有帮助 。
本文来自:《The dialog manager part 6: Subtleties in message loops》
【|对话框管理器第六章:消息循环中的细节】
- 文件资源管理器中的“快速访问”怎么办?
- Windows文件资源管理器中隐藏着一些我们平时很少用|windows10文件资源管理器的使用技巧
- 无人驾驶真的要来了吗?百度推出第六代无人车Apollo RT6
- 本文转自:北青网实有市场主体数量(万户)截至目前各类市场主体数量及占比四川新闻网-首屏新...|四川市场主体突破800万户 居全国第六位
- 百度发狠,投下炸弹第六代无人车RT6:特斯拉、Waymo、Cruise拉响警报
- 百度|百度第六代量产无人车重磅发布!成本仅25万元
- 本文转自:陕西网2022第六届丝绸之路网络安全论坛将于7月27日在陕西宾馆盛大开幕。|尚易安华:保护关键信息基础设施 助力国家网络安全建设
- 阿波罗|成本25万!第六代量产无人车Apollo RT6发布,百度造车有戏?
- 成本25万元 百度第六代无人车Apollo RT6正式发布
- 百度发布第六代量产无人车:成本25万仅为行业1/10,将部署上万辆