当一个窗口被销毁而仍然有消息等待它时会发生什么?
考虑以下场景:
共有三个线程,A、B 和 C。线程 C 拥有一个窗口。
线程 A 和 B 用于SendMessage
将消息发布到窗口。来自 A 的消息首先到达。当 C 处理来自 A 的消息时,它使用DestroyWindow
.
来自线程 B 的消息会发生什么?线程B的调用是否SendMessage
返回?
这在内部如何运作?
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)
.
原则上,你提议做的事情是不安全的。线程 C 无法保证线程 B 已经发送了消息;如果窗口在线程 B 发送消息之前被销毁,并且窗口句柄恰好在此期间被重用,则线程 B 可能最终将消息发送到错误的窗口,该窗口可能位于不同的应用程序中。
最佳实践是确保在调用 DestroyWindow之前已通知所有线程特定窗口句柄已变为无效。
但是,实际上,在错误的时间重新使用手柄的风险非常低。如果提前通知其他线程是不合理的,那么您不太可能因此陷入困境。我相信 kicsit 断言消息不会最终在线程 C 的消息队列中等待是正确的,尽管据我所知文档并没有明确承诺这一点。