2011-12-01 44 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就是这样一种机制。

相关问题