2011-12-01 26 views
0

http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx線程可以擁有其他句柄嗎?

在擁有此控件的 基礎窗口句柄的線程上執行指定的委託。

根據MSDN文章,thread可以擁有其他句柄。

我最好的猜測是,該thread是一些特殊的超kernel object,具有handle其他handles可以參考呢?

,如:

拉手|螺紋手柄參考

3201 | 20

4882 | 20

4827 | 7

+0

究竟是什麼問題?如果自定義線程可以擁有其他例如窗戶把手? –

+0

@FelixK,Spot on。 – ebb

+0

託管線程不一定直接映射到操作系統線程,它取決於主機,我認爲.net CLR主機管理它不同於sql服務器。 –

回答

2

在這些條款中,是的。

基本上,Windows GUI的幕後是一個「消息循環」,它是Windows操作系統(瞭解鼠標,鍵盤和其他輸入硬件)與您的程序之間的雙向通信不需要知道具體細節,但需要根據這些輸入設備對您的應用中的用戶輸入做出響應)。程序中有一個線程(通常是主程序執行線程),用於維護此循環,偵聽從Windows進入程序的消息,並解析消息並將消息傳遞給各種GUI控件和其他代碼對象。這個「GUI消息傳遞線程」知道並維護對程序中所有GUI對象的所有窗口句柄的引用;它必須,因爲如果它不,它不能將消息傳遞給它們,也不會從它們收聽消息。

嘗試從連接到消息循環的線程之外對GUI控件實例執行某些操作通常是個壞主意。通過這樣做,控件所擁有的控件或子控件就有可能從消息循環中分離出來,或者永遠不會附加到第一個地方。 「GUI消息線程」然後不再知道該控件,並且不再將消息傳遞給它或從中傳出。這些控制變成「流氓」。程序和Windows都不能告訴控制器移動,重新繪製或者消失。 Windows在這一點上唯一能夠「控制」窗口的方法是關閉擁有它的進程,從而終止整個程序。

爲了避免這種情況,GUI控件有一個特殊的方法「Invoke」(和一個異步堂兄「BeginInvoke」),它設計用於GUI消息傳遞線程之外。這些方法基本上是通過Windows消息循環從窗口發送一條消息給自己,讓主GUI線程執行Invoke調用中指定的委託。通過這樣做,任何在該代碼中創建或作爲該代碼的結果創建的新GUI對象都將被主GUI線程所知曉。

+0

哇! - 這確實清除了很多東西 - 謝謝! - 「主程序執行線程」和「GUI消息傳遞線程」是同一個線程嗎? – ebb

+0

幾乎總是。可以將不同的線程附加到Windows消息循環中,但這種情況很少發生。它可能是有用的,但你必須非常小心。 – KeithS

+0

@KeithS:我認爲ebb在詢問是否可以從應用主線程以外的線程創建窗口。這很簡單(儘管你需要小心,main()不會在窗口線程關閉之前返回)。 –

1

在自定義線程中創建句柄時,自定義線程可以擁有句柄。其實我不認爲你可以改變把手的主人。分享也不應該。

一個線程可以一次擁有多個句柄。

0

每個窗口都由創建該窗口的線程擁有。許多窗口操作只能在該線程上執行,因此有一個機制可以確保代碼在窗口線程上執行,這一點很重要。

Forms.Invoke就是這樣一種機制。

相關問題