http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx線程可以擁有其他句柄嗎?
在擁有此控件的 基礎窗口句柄的線程上執行指定的委託。
根據MSDN文章,thread
可以擁有其他句柄。
我最好的猜測是,該thread
是一些特殊的超kernel object
,具有handle
其他handles
可以參考呢?
,如:
拉手|螺紋手柄參考
3201 | 20
4882 | 20
4827 | 7
http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx線程可以擁有其他句柄嗎?
在擁有此控件的 基礎窗口句柄的線程上執行指定的委託。
根據MSDN文章,thread
可以擁有其他句柄。
我最好的猜測是,該thread
是一些特殊的超kernel object
,具有handle
其他handles
可以參考呢?
,如:
拉手|螺紋手柄參考
3201 | 20
4882 | 20
4827 | 7
在這些條款中,是的。
基本上,Windows GUI的幕後是一個「消息循環」,它是Windows操作系統(瞭解鼠標,鍵盤和其他輸入硬件)與您的程序之間的雙向通信不需要知道具體細節,但需要根據這些輸入設備對您的應用中的用戶輸入做出響應)。程序中有一個線程(通常是主程序執行線程),用於維護此循環,偵聽從Windows進入程序的消息,並解析消息並將消息傳遞給各種GUI控件和其他代碼對象。這個「GUI消息傳遞線程」知道並維護對程序中所有GUI對象的所有窗口句柄的引用;它必須,因爲如果它不,它不能將消息傳遞給它們,也不會從它們收聽消息。
嘗試從連接到消息循環的線程之外對GUI控件實例執行某些操作通常是個壞主意。通過這樣做,控件所擁有的控件或子控件就有可能從消息循環中分離出來,或者永遠不會附加到第一個地方。 「GUI消息線程」然後不再知道該控件,並且不再將消息傳遞給它或從中傳出。這些控制變成「流氓」。程序和Windows都不能告訴控制器移動,重新繪製或者消失。 Windows在這一點上唯一能夠「控制」窗口的方法是關閉擁有它的進程,從而終止整個程序。
爲了避免這種情況,GUI控件有一個特殊的方法「Invoke」(和一個異步堂兄「BeginInvoke」),它設計用於GUI消息傳遞線程之外。這些方法基本上是通過Windows消息循環從窗口發送一條消息給自己,讓主GUI線程執行Invoke調用中指定的委託。通過這樣做,任何在該代碼中創建或作爲該代碼的結果創建的新GUI對象都將被主GUI線程所知曉。
在自定義線程中創建句柄時,自定義線程可以擁有句柄。其實我不認爲你可以改變把手的主人。分享也不應該。
一個線程可以一次擁有多個句柄。
每個窗口都由創建該窗口的線程擁有。許多窗口操作只能在該線程上執行,因此有一個機制可以確保代碼在窗口線程上執行,這一點很重要。
Forms.Invoke就是這樣一種機制。
究竟是什麼問題?如果自定義線程可以擁有其他例如窗戶把手? –
@FelixK,Spot on。 – ebb
託管線程不一定直接映射到操作系統線程,它取決於主機,我認爲.net CLR主機管理它不同於sql服務器。 –