2009-06-11 65 views
1

有幾個選擇這裏,可能是,但你會怎麼建議是最安全的方式子框架窗口完成以下最佳方法:關閉,並等待使用Win32/MFC

我有一個具有parent = NULL的子CFrameWnd(至少在應用程序正在運行時,它可以與主應用程序分開生活)。我已將所有這些窗口存儲在列表中。當主應用程序關閉時(MainFrame獲取OnClose),我會遍歷數組並向所有人發佈PostMessage(WM_CLOSE)。然而,問題在於他們每個人在關閉之前都必須做些事情。所以,我需要等他們。但是我們都在同一個線程中......那麼,我怎樣才能等待孩子們關閉,而不會在單線程應用程序中阻止他們自己的處理呢?

或者我應該啓動一個工作線程來照顧它?會更容易嗎?

在此先感謝!

回答

3

使用SendMessage()代替PostMessage()。

編輯:另一種選擇可能是簡單地處理你的子窗口中的WM_DESTROY(取決於你的代碼當然)。

+0

是的,當然... WM_DESTROY對我來說太晚了,但SendMessage是我所需要的 - 有時候顯而易見的東西在你面前:)謝謝。 – dennisV 2009-06-11 14:20:11

1

那麼你當然不能等待他們關閉,你至少需要pump messages,以便他們能夠接收和處理WM_CLOSE。我想你怎麼做到這一點取決於你。但我看到你在做PostMessage。爲什麼不改爲SendMessage - 這將在窗口的窗口過程中同步運行。或者你想退出應用程序?那麼你應該真的使用PostQuitMessage然後以正常的方式泵送消息,直到GetMessage返回0.許多選項。

Pumping messages意味着在代碼中有一個循環,看起來像這樣。您不必撥打AfxPumpMessages,但這可能會做類似的事情。實際上有許多不同的方式來取決於你想要做什麼來傳遞信息。另外還有相當多的功能可以爲你提供信息。

BOOL bRet; 

// note that GetMessage returns 0 when WM_QUIT is received - this is how PostQuitMessage 
// would work to get us to shut down 
// We are passing NULL for the hWnd parameter - this means receive all window and 
// thread messages for this thread 
while((bRet = GetMessage(&msg, NULL /* hWnd */, 0, 0)) != 0) 
{ 
    if (bRet == -1) 
    { 
     // handle the error and possibly exit 
    } 
    else 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
} 

如果您發佈的消息發佈到窗口或窗口,那麼你就需要抽取消息。會發生什麼情況是消息進入與該窗口相關的線程(此線程)的隊列 - 消息泵會將它們提取出來並將它們分發到正確的窗口過程。

如果您發送了消息而不是發佈消息,那麼該窗口的窗口過程將直接調用 - 而不是進入隊列。您不需要泵送消息,因爲一旦SendMessage返回消息已完全處理。

方式PostQuitMessageworks是通過上指示應用程序應該退出消息隊列中設置標誌。 WM_QUIT消息不是真正的窗口消息,你會發送 - 會發生什麼GetMessage將在所有其他發佈的窗口消息處理完畢後檢查此標誌,並且如果設置返回0。這將導致所有窗口正確關閉,並且您不需要將它自己發送到窗口。

+0

是的,我可以使用AfxPumpMessage,但這不適用於單個線程。 SendMessage似乎是最好的選擇。是的,我正在退出應用程序,PostQuitMessage是一個好主意 - 但我不明白我如何使用PostQuitMessage,然後在GetMessage返回0時抽取消息 - 是否在主窗口中顯示GetMessage?它可以在很多其他時間返回0。不太確定你的意思。謝謝! – dennisV 2009-06-11 14:23:59