2009-06-03 55 views
3

當UI線程在WaitHandle或其他線程原語上等待時,是否有任何方法來處理所有Windows消息?在等待WaitHandle時運行消息循環

我意識到它可能會造成非常混亂的重入問題;無論如何,我想這樣做。

EDIT:等待發生在必須在UI線程上運行的複雜函數中。因此,將等待移動到後臺線程不是一種選擇。 (將函數分成兩部分會造成複雜且不可維護的混亂)

回答

4

我會在一個單獨的後臺線程中運行整個「不可拆分的複雜功能」,並僅在需要時才向GUI報告(使用Invoke/BeginInvoke方法在控制上)。

在更加強化的版本中,您應該在不依賴於UI的非UI控制器中運行復雜功能,並且更容易進行單元測試。回調UI並在UI中顯示結果,可以通過讓UI來描述控制器提供的事件來輕鬆實現。

3

爲什麼不只是產生另一個線程來執行等待並讓他通過消息(或其他)在適當的時刻通知UI線程?

這是在阻塞事件期間允許UI線程消息處理的常用方法。

編輯: 我現在看到 - 你已經在UI代碼中內置了應用邏輯邏輯。那麼,這真是一個設計問題。從長遠來看,你最好從UI中將這些功能分解爲一個獨立的對象,並使用一些機制與工作人員的UI交流狀態。

除了保持您的UI代碼專注於UI的好處之外,這允許您單獨測試邏輯代碼。

+1

+1,在UI線程上等待並不酷。使用回調。 – 2009-06-03 19:43:29

+0

因爲我正在等待一個必須在UI線程上運行的函數(綁定到UI的非線程安全數據對象),並且我不想分割它並保存局部變量。 – SLaks 2009-06-03 19:47:05

2

不確定C#,但在普通的Win32編程中,您可以使用其中一個MsgWaitFor ...()函數進行實際等待。當消息出現在消息隊列中時,它會通知你,以及當等待的對象變成信號時。如果報告存在消息,則可以調用GetMessage(),TranslateMessage()和DispatchMessage()來處理消息,然後再返回等待狀態。

2

我通常會建議把你的等待條件放在另一個線程上。但是,也就是說,你總是可以在任何時候調用Application.DoEvents來處理消息泵,包括在「等待」等待句柄(只是超時,執行事件,等待超時等等,直到你得到「通過「等待處理」)。