在上一篇文章中,我们介绍到,模态消息循环会吃掉线程消息。
今天的文章中,我们将会演示这个场景,并在将来的文章中尝试修复这个问题。
还是基于我们的例子程序,然后做一些修改,如下图所示:
>> 请移步 topomel.com 查看图片 <<
试着运行这个修改后的例子程序,你会发现,它会每隔2秒钟发出蜂鸣声,至少大部分时间它是这样的。
如果你右键单击标题栏或抓住窗口边缘开始调整大小或拖动滚动条或执行拖放择或显示消息框,则蜂鸣声会停止。
那是因为,所有上面的操作都是模态操作,而模态消息循环正在吃掉线程消息。
保存这个程序,因为我们会回到它。
显而易见的解决方案是,将消息发布到主窗口本身而不是线程。 因为你已经有了一个主窗口的句柄,为何不用它呢?
>> 请移步 topomel.com 查看图片 <<
好了,这个问题解决了。我会试探另外一种玩法,就是以一种错误的方式来解决此问题,因为我想讲讲消息过滤器的主题。 下次吧。
总结
在Topomel Box中,我也用到了一些多线程方面的小技巧。这里分享若干:
1. 工作线程绝对禁止直接操作用户界面,如SetWindowText等。
2. 工作线程可以通过发送消息(同步或者异步的方式)给主线程,实现间接的操作用户界面。
3. 对于完美主义者的来说,工作线程的退出必须是优雅的,尽可能使其”自然结束”,而不是”强制中止”。
4. 工作线程里分配的资源,在其自然结束前,必须主动释放,否则程序长期运行下,会造成资源泄露甚至耗尽。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Watching thread messages disappear》