模态消息循环会吃掉线程消息

模态消息循环会吃掉线程消息

作者:BlogUpdater |  时间:2022-09-22 |  浏览:160 |  评论已关闭 条评论

线程消息(例如,你通过PostThreadMessage发送给线程的消息)在传递给DispatchMessage函数的时候,不会去任何地方。
如果你仔细琢磨一下,就会明白,这是很显然的一件事情:因为这个线程消息没有关联到一个窗口句柄。DispatchMessage对这种没有关联窗口的消息,它不知道如何处理。
它不得不将这个消息简单地丢弃。

这对进入模态循环的线程产生了可怕的后果,任何带有窗口的线程几乎肯定会在某个时候这样做。回想一下,传统的模态循环如下所示:

如果 GetMessage 函数返回一个线程消息,它只会简单地通过 TranslateMessage 和 DispatchMessage 而不会被处理。 这个消息,永远地丢失了。

出于这个原因,通常要在创建窗口的线程上避免发送线程消息。
当然,如果你要创建一个窗口,为什么不使用 PostMessage 代替,将该窗口作为发布消息的目标传递呢? 由于现在有一个窗口句柄,因此 DispatchMessage 函数知道将消息提供给你的窗口过程。 结果是一个好结果:消息不会丢失。

总结
看到这里的猿友,请赶紧,立即打开你的Visual Studio工程,然后全盘搜索下,看看是否用到了PostThreadMessage,然后看看是否用它传递了消息给另外一个线程。
这里有一个例外,那就是,你使用PostThreadMessage发送WM_QUIT给另外一个线程,是可以的。

最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Thread messages are eaten by modal loops》

最近我写了个东西
正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。

评论已关闭。