4

当一个窗口被销毁而仍然有消息等待它时会发生什么?

考虑以下场景:

共有三个线程,A、B 和 C。线程 C 拥有一个窗口。

线程 A 和 B 用于SendMessage将消息发布到窗口。来自 A 的消息首先到达。当 C 处理来自 A 的消息时,它使用DestroyWindow.

来自线程 B 的消息会发生什么?线程B的调用是否SendMessage返回?

这在内部如何运作?

4

2 回答 2

1

According to MSDN, DestroyWindow "[...], flushes the thread message queue, [...]". I was not sure whether this meant processing the messages or dumping them, so I tried. It turned out to be the latter: all pending posted messages are removed from the queue and ignored. As for non-queued messages: in my tests the pending SendMessage call returned and set the last error to ERROR_INVALID_PARAMETER - 87 (0x57).

于 2012-11-05T14:29:06.820 回答
1

原则上,你提议做的事情是不安全的。线程 C 无法保证线程 B 已经发送了消息;如果窗口在线程 B 发送消息之前被销毁,并且窗口句柄恰好在此期间被重用,则线程 B 可能最终将消息发送到错误的窗口,该窗口可能位于不同的应用程序中。

最佳实践是确保在调用 DestroyWindow之前已通知所有线程特定窗口句柄已变为无效。

但是,实际上,在错误的时间重新使用手柄的风险非常低。如果提前通知其他线程是不合理的,那么您不太可能因此陷入困境。我相信 kicsit 断言消息不会最终在线程 C 的消息队列中等待是正确的,尽管据我所知文档并没有明确承诺这一点。

于 2012-11-09T00:35:09.680 回答