2008-11-05 58 views
1

我正在閱讀這個帖子/文章:https://stackoverflow.com/questions/262298/windows-c-ui-technology2008 MFC和線程?

我也想知道一個非.NET的UI框架。特別是 - 在.NET支持串行端口之前(我不能相信他們將.NET從.NET的第一個版本中解放出來),我不得不將MFC用於應用程序。我不是一個GUI開發人員,並且很快發現自己拉扯我的頭髮是因爲MFC與我的應用程序中的其他線程發揮不佳能力的可怕性 - 例如,調用UI控件方法來更新數據或從其他線程執行其他操作。這些挑戰中的大多數都已經處理完畢,但是應用程序代碼與消息傳遞等過於複雜,僅僅是爲了解決MFC的缺陷。

所以 - 我的問題是:「新的和改進的」mfc是否支持線程 - 也就是說,如果我從另一個線程調用某個GUI對象的gui對象,它會像舊的mfc一樣崩潰/嘔吐,還是可以播放在現實世界?

編輯

爲了澄清 - 我瞭解在不同的線程的GUI改寫(munging)的關注,但我希望的是,不是程序員創建自定義的消息,並從工作線程發送它們 - 即GUI框架將爲我工作,我可以從其他線程調用對象方法。也許這太希望了 - 特別是如果線程還不是語言規範的一部分的話。

+1

而五年後,我剛纔在這裏問了一個相關的問題; http://stackoverflow.com/questions/17340285/can-i-have-multiple-gui-threads-in-mfc?noredirect=1#comment25159554_17340285沒有可靠的答案,但一些有用的評論。 – 2013-06-27 11:47:18

回答

2

MFC的基本體系結構在新版本中並沒有真正改變。如果您之前對線程支持不滿意,那麼可以肯定地說,您仍然不會。我同意DavidK所說 - 這是所有框架必須處理的固有問題。 MFC沒有提供多線程幫助的主要原因幾乎肯定是因爲它最初是在1992年推出的16位Windows。此時Windows不支持多任務處理,並且實際上是單線程的。

4

這不是MFC的限制 - 它是Windows的設計。你不能從隨機的其他線程開始向任意控件發送消息。 (有時候,你可以,但是你需要知道你在做什麼。)在.NET世界中同樣如此 - 一旦控件可見,你需要使用委託來更新它,以便更新動作發生在正確的線程上。更一般地說,我認爲從經驗來看,你幾乎總是有更好的方式,只有一個線程在應用程序中處理GUI,並使其餘線程完全工作。讓多個線程與GUI交互導致瘋狂嘗試跟蹤發生的事情。

編輯

簡短的回答原來的問題是,我很害怕,「無」:有許多人對如何線程,MFC和Windows交互沒有根本性的重新工作。在這一點上,微軟並未優先考慮MFC,我不認爲這會改變。

+0

我明白你的觀點。 MFC應該在實現中包裝它,並從其他線程調用的對象發送消息。我不明白這是什麼問題 - 處理UI消息顯然必須在一個線程中完成 - 但是應該允許從任何線程IMO發送事件。 – Tim 2008-11-05 19:51:21

+0

我不得不說,我必須通過與其他線程使用MFC的迴轉是令人震驚的。我懷疑它與.NET GUI框架相比更加乾淨,但也許我錯了。 – Tim 2008-11-05 19:51:55

+0

我認爲從多個主題發佈消息通常會安全,但我同意這是一個壞主意。 – Aardvark 2008-11-05 20:13:17

1

你可以做的一件事是將自定義消息發佈給自己,windows消息泵會將該消息處理並在主線程上處理它,這樣所有代碼都可以正常工作。顯然,你需要設置自己以異步的方式使用Windows,但這是Windows窗口的整個設計。

您可以使用工作線程幫忙,但讓GUI在主線程上工作。

你會發現大多數窗口工具包也是單線程的(因爲那裏往往只有一個用戶使用它們:)),那些不是比他們的價值更復雜。

0

使用.NET gui和線程,主要應用程序代碼在MFC dll中。

通過c#代理調用它