2011-03-31 24 views
2

我有一個長時間運行的任務和一個通知用戶這個任務正在運行的對話框。任務完成後,Dialog會通知用戶。如何通知CDialog對象有關從另一個線程完成的任務?

我以爲在使用AfxBeginThread創建的Worker-Thread內啓動任務,並且任務完成後,我將用戶消息WM_APP + 1PostMessage發佈到對話框。 Appeelly PostMessage只能在同一個線程內使用,因此我嘗試了PostThreadMessage,但在對話框中使用ON_THREAD_MESSAGE時出現編譯器錯誤。

現在我不知道如何繼續。你有什麼建議嗎?

謝謝!

回答

5

你可以使用PostMessage(),它會工作。 gui線程將處理該消息。

我相信PostMessage文件是明確的:

地方(職位)在與創建指定 窗口並返回,而無需等待 線程的 線程相關聯的 消息隊列中的消息處理該消息。

所以,如果工人在一個窗口的消息隊列中放置一個消息,
其創建的窗口將處理消息的線程。
在你的情況下,它是主要的(或gui)線程。

+0

我錯了,PostMessage工作正常。問題是,我將一個NULL窗口句柄傳遞給PostMessage。在創建對話框之前我調用了'GetSafeHwnd'。謝謝你的回答,我找錯了方向找出原因。 – 2011-03-31 11:33:40

2

PostMessage()SendMessage()都將消息異步或同步地傳遞給窗口句柄。

窗口句柄具有線程關聯。這意味着任何與窗口句柄交互的代碼都必須從擁有窗口的線程運行,也就是創建該窗口的線程。

PostMessage()SendMessage()通過確保消息處理完成後由擁有該窗口的線程處理。

對於PostMessage()這是一個簡單的任務。每個線程都有自己的個人消息隊列。當您致電PostMessage()時,系統只會將消息放置在屬於擁有該窗口的線程的消息隊列中。然後在線程抽取其消息隊列時稍後處理該消息。

對於SendMessage(),安排消息由右側線程處理更加困難。如果您從擁有該窗口的線程調用SendMessage(),則直接調用窗口過程。否則,系統通知其他線程同步消息需要運行,然後阻塞。另一個線程(擁有窗口的線程)只在處理消息時纔會對某些系統調用進行檢測,以檢測消息是否正在等待。這意味着跨線程調用SendMessage()可能會導致性能問題。

相關問題