【发布时间】:2014-05-30 16:16:11
【问题描述】:
我有一个后台线程来处理数据,想将结果发送到主窗口,但是在后台线程退出之前,窗口可能已经被销毁了。
我使用PostMessage传递一些新创建的对象(在堆中创建),如果成功了,消息一定会被主窗口处理吗?
如果不是,这种情况的最佳做法是什么?
ps:我担心的是,在发布消息时,窗口是有效的,但在消息传递之前它就被销毁了。如果是这样,我不能delete 对象。
【问题讨论】:
-
不要将动态对象发送到窗口;将它们发布到推送时同步的队列(例如
std::queue),然后将通知(可以是任何 WM_USER 或注册的窗口消息)发布到窗口以检查队列(其中它将在拉出时同步)。如果窗口过早关闭,调用者可以停止推送数据并简单地清除队列及其内容。你可能还会发现你不需要动态指针(如果你追求这个逻辑,这将是智能指针)。 -
@WhozCraig 谢谢。很励志
-
@WhozCraig 在
WM_USER到WM_APP-1范围内的消息保留供窗口类(如编辑控件)的实现者使用。不要将此范围内的消息用于进程内通信。WM_APP+x范围的消息是为此目的而保留的。 -
@IInspectable 这完全有道理。我已经很久没有使用 Windows 编程了,其中一些在这一点上是一个巨大的迷雾。谢谢指正。