【发布时间】:2013-06-13 20:08:32
【问题描述】:
我有一个线程调用::PostMessage(hWnd, [...]); 向主线程发送一条消息,提醒它异步操作的结果。
但是,我担心如果线程需要很长时间才能完成其操作,那么在调用PostMessage 时hWnd 可能不存在(用户可能已经关闭了窗口)。
如果hWnd 无效,MSDN Documentation 不会说明任何结果。
您是否从经验或其他文档中知道如果hWnd 无效,我可以期待什么?
【问题讨论】:
-
也许你应该隐藏窗口而不是销毁它,直到线程完成使用它。
-
@Ben Voigt:我同意,但我在一家大型公司工作,无法控制这种架构选择。
-
在大型公司环境中,您可以提交错误。看我的回答……著名的 Raymond Chen 说这是一个错误。另一种选择是使用
weak_ptr并在窗口被破坏时使其无效......尽管这会给您带来竞争条件,即从弱指针检索HWND 和实际调用PostMessage之间的间隔。所以真的,你需要让窗口保持活力。 -
另一种可能的解决方案是使用任何其他形式的跨线程队列。
-
我通常做的是隐藏窗口并通知线程终止,(以任何方式工作:)。当线程即将终止时,它会向窗口发送最后一条自定义消息,指示窗口自行销毁。