2010-03-01 49 views
3

我假設它可能會這樣做,因爲google chrome等程序已經更好,並將每個選項卡放在單獨的進程中。 那麼我怎麼能把一個GUI控件,如datagridview在一個單獨的線程?將GUI控件放在不同的線程上?

回答

0

我認爲那是不可能的......爲了修改一個控制(例如,通過增加一個孩子吧。) ,你需要在創建父代的同一個線程上。因此,您的子控件必須由創建其父項的相同線程創建。

我記得在不同的線程見狀創建的唯一要素都是非模態對話框等,但,這只是可能,因爲非模態對話框是新的窗口/表格。

谷歌瀏覽器可能會讓每個標籤在不同的進程中運行,但這並不意味着表示標籤的實際UI元素不會被封送到主UI線程(創建包含瀏覽器的窗口的那個線程)以供顯示。

當然,現在你仍然可以在單獨的線程上執行加載網格數據的工作,Ardman的鏈接將幫助你。但是,實際上將數據綁定到網格時,您需要在UI線程(或者更確切地說,創建要修改的控件的線程)上執行此操作。

希望這會有所幫助!

+0

在CreateWindow中沒有要求父項由同一個線程擁有。所以這只是.NET不支持的另一個Windows功能。 – 2010-05-25 20:58:42

+1

我提到你確實可以在不同的線程上創建新的窗口/窗體......我誤解你的意思嗎? – Phong 2010-05-25 22:01:42

+0

我相信Google Chrome並不僅僅是在不同的線程中進行後臺提取,而是在不同的線程中爲每個選項卡執行渲染和任何事件處理。否則,您在一個標籤中最喜歡的Flash遊戲可能會降低您在另一個選項卡中的YouPo,呃,YouTube的體驗。 – SimonC 2012-03-06 05:04:37

0

這不是處於單獨線程中的控件,而是通過控件啓動的請求。

假設您在不同的地址上打開了兩個選項卡。您點擊一個鏈接,指向第一個標籤頁上的另一個網站。同時,您點擊第二個標籤上的另一個鏈接。

首先,您需要知道當您單擊第一個選項卡上的鏈接時可能會啓動一個線程,從而使其可以響應GUI。這與第二個選項卡相同,當您單擊其中的鏈接時。其次,我們現在有一個線程(主線程,也稱爲GUI線程),其工作是處理用戶交互。另一個線程處理來自第一個選項卡上鍊接的請求,以及另一個線程處理第二個選項卡上的鏈接。第三,儘管正在處理您對這兩個標籤的鏈接請求,但您可以打開一個新標籤並在Google上進行搜索!然後,即使在應用程序和瀏覽器被請求佔用的情況下,這也要求您的GUI具有響應能力。

四,關於後臺線程的迴歸,他們將返回到主線程報告其工作的結果,也就是說,他們要求獲得解決DNS的網絡響應鏈接的鏈接點擊。

一種有趣的方式,使其在C#可能,並保持儘可能的簡單,就是通過BackgroundWorker類。

BackgroundWorker的每個實例表示一個線程。因此,當用戶單擊鏈接時捕獲鼠標單擊時,您需要實例化應用程序所需的BackgroundWorker。然後該請求被髮送到當對RunWorkerAsync()方法進行調用時引發的DoWork()事件。

如何使用BackgroundWorker

0

此Microsoft文章Here's an interesting tutorial解釋大致Windows資源管理器如何做你問什麼:

http://msdn.microsoft.com/en-us/library/ms741870.aspx#multi_browser

你基本上每個頂層窗口一個線程,所有的該窗口的事件將在同一個線程中觸發。

+0

爲什麼downvote?問題是如何在多於事件線程上使用GUI控件,這正是鏈接文本討論的內容。 – SimonC 2012-03-12 09:35:09

+0

這可以適應WinForms嗎? – toddmo 2014-12-08 23:11:43