【问题标题】:How to design cleaner PostMessage chain in WinApi/MFC如何在 WinApi/MFC 中设计更简洁的 PostMessage 链
【发布时间】:2011-05-10 06:28:17
【问题描述】:

我有一个 MFC GUI 应用程序,它有多个框架(有点像 Outlook 的主窗口行为,以及在新框架中创建的消息/约会窗口,或 Skype 之类的多框架同步),我需要 PostMessage malloc 'ed 数据通过窗口层次结构。

比如说,我得到了字符串,_wcsdup 它,PostMessage(WM_NEWSTRING, ...),然后,层次结构深处的某个地方的控件处理它,或者如果没有订阅者,则清除消息。

我现在正在研究的是,所有消息都发布到应用程序线程,线程找到活动框架或最适合的框架,将消息传递给它,框架将消息传递给它的视图,视图将消息传递给子视图以此类推,如果没有视图来处理消息,它就会被释放。

问题是这些链接命令写起来很累,因为我必须在我拥有的每个 CWnd 类中复制消息转发代码。同时,资源清理也很不愉快,因为如果没有窗口可以捕获消息,就必须有人调用 free。因此,简单地将消息发布到主消息泵而不进行额外处理,希望有人总是能抓住它,这不是一种有效的方法。 PostMessage 返回 S_OK,没有人认为该消息是可处理的,它处于悬空状态。

对于我正在寻找的东西,是否有更好、更正确的方法?

【问题讨论】:

  • 没有理由不只使用SendMessage,轻松解决内存管理问题。很难理解为什么您不只使用方法调用。
  • 多线程... SendMessage 是有效的序列化+上下文切换。
  • 如果您对使用此方法一无所知,为什么不在消息传递链的最末端添加一个消息接收器,以清除任何使其到达该距离的消息?

标签: winapi mfc postmessage


【解决方案1】:

我永远不会像你描述的那样使用PostMessage。我的解决方案通常涉及握手:

// From CNotifierBlah
PostMesssage(hWnd, UWM_NEW_DATA, 0, 0);
//
LRESULT CDestinationWnd::OnNewData(WPARAM wParam, LPARAM lParam)
{
    CNewData newData = GetNotifierBlah().GetNewData(); // Thread-safe getter!
}

Observer pattern差不多。

【讨论】:

  • 我采用了一些接近的方法,但不完全是通过通知器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
  • 1970-01-01
  • 2016-04-24
相关资源
最近更新 更多