【问题标题】:If PostMessage Succeeded, is the message guaranteed to be processed by the window?如果 PostMessage 成功,是否保证消息被窗口处理?
【发布时间】:2014-05-30 16:16:11
【问题描述】:

我有一个后台线程来处理数据,想将结果发送到主窗口,但是在后台线程退出之前,窗口可能已经被销毁了。

我使用PostMessage传递一些新创建的对象(在堆中创建),如果成功了,消息一定会被主窗口处理吗?

如果不是,这种情况的最佳做法是什么?

ps:我担心的是,在发布消息时,窗口是有效的,但在消息传递之前它就被销毁了。如果是这样,我不能delete 对象。

【问题讨论】:

  • 不要将动态对象发送到窗口;将它们发布到推送时同步的队列(例如std::queue),然后将通知(可以是任何 WM_USER 或注册的窗口消息)发布到窗口以检查队列(其中它将在拉出时同步)。如果窗口过早关闭,调用者可以停止推送数据并简单地清除队列及其内容。你可能还会发现你不需要动态指针(如果你追求这个逻辑,这将是智能指针)。
  • @WhozCraig 谢谢。很励志
  • @WhozCraig 在WM_USERWM_APP-1 范围内的消息保留供窗口类(如编辑控件)的实现者使用。不要将此范围内的消息用于进程内通信。 WM_APP+x 范围的消息是为此目的而保留的。
  • @IInspectable 这完全有道理。我已经很久没有使用 Windows 编程了,其中一些在这一点上是一个巨大的迷雾。谢谢指正。

标签: windows winapi


【解决方案1】:

我使用PostMessage传递一些新创建的对象(在堆中创建),如果成功了,消息一定会被主窗口处理吗?

如果对PostMessage 的调用成功,则将消息放入队列中。然后,当线程抽取其消息队列时,将处理该消息。如果线程无法抽出它的队列,或者在处理消息时接收者窗口不再存在,那么它将不会被传递。

【讨论】:

    猜你喜欢
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多