2010-11-15 24 views
1

我有一個MFC GUI應用程序,它具有多個框架(有點像Outlook主窗口的行爲,消息/預約窗口是在新框架中創建的,幀同步),我需要通過窗口層次結構PostMessage malloc'ed數據。我得到字符串,_wcsdup,PostMessage(WM_NEWSTRING,...),以及層次結構深處的控制處理它,或者如果沒有訂閱者,則會清除消息。如何在WinApi/MFC中設計更清潔的PostMessage鏈

我現在正在研究的是,所有消息都發布到應用程序線程,線程發現活動幀或最適合幀,將消息傳遞給它,幀將消息傳遞給它的視圖,視圖將消息傳遞給子視圖等等,如果沒有處理消息的視圖,它就會被釋放。

問題是,這些鏈接命令非常累人寫,因爲我必須在每個CWnd類中複製消息轉發代碼。與此同時,資源清理是非常不愉快的,因爲如果沒有窗口可以捕捉到這個信息,那麼有人必須打電話給免費的人。因此,只需將消息發佈到主消息泵而無需額外處理,希望有人總能抓住它,這不是一種有效的方法。 PostMessage返回S_OK,沒有人看到該消息是可處理的,並且它留下了懸掛。

對於我在找什麼,有沒有更好的正確方法?

+1

沒有理由不僅僅使用SendMessage,而是解決內存管理問題。很難理解你爲什麼不只是使用方法調用。 – 2010-11-15 16:11:01

+0

多線程... SendMessage是有效的序列化+上下文切換。 – Coder 2010-11-16 08:49:15

+1

如果你對使用這種方法已經失望了,爲什麼不把消息接收器添加到消息傳遞鏈的最後,以便清除任何使之成爲現實的消息? – Jon 2011-03-31 16:36:49

回答

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相同。

+0

我採取了一些接近,但不完全通過通知。 – Coder 2011-09-26 11:17:11