模态消息循环会吃掉线程消息
线程消息(例如,你通过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)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。
相关推荐
- 在 Visual Studio 中设置指针星号的位置
- Posted on 04月13日
- 关于GWLP_WNDPROC的那些奇怪的返回值
- Posted on 08月08日
- 使用纤程简化枚举器5:组合
- Posted on 03月06日
- 继续滚动条系列:使用键盘来控制滚动条
- Posted on 12月11日
评论已关闭。