一个线程可以拥有其他句柄吗?

时间:2011-12-01 18:29:08

标签: c# windows

http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx

  

在拥有控件的线程上执行指定的委托   底层窗口句柄。

根据MSDN文章,thread可以拥有其他句柄。

我最好的猜测是,thread是一些特殊的超级kernel object,其他handle也可以引用handles吗?

像:

  

手柄|线程句柄引用

     

3201 | 20

     

4882 | 20

     

4827 | 7

3 个答案:

答案 0 :(得分:2)

在这些方面,是的。

基本上,Windows GUI的幕后是一个“消息循环”,它是Windows操作系统(它知道鼠标,键盘和其他输入硬件)和你的程序(它没有'之间的双向通信。需要知道具体细节,但需要根据这些输入设备响应您应用中的用户输入。程序中有一个线程(通常是主程序执行线程),它维护这个循环,监听从Windows进入程序的消息,以及解析消息并将消息传递给各种GUI控件和其他代码对象。这个“GUI消息传递线程”知道并维护对程序中所有GUI对象的所有窗口句柄的引用;它必须,因为如果它没有,它不能传递消息给他们,也不会收听来自他们的消息。

尝试从连接到消息循环的线程外部对GUI控件实例执行某些操作通常是个坏主意。通过这样做,控件所拥有的控件或子控件可以从消息循环中分离出来,或者从不首先附加到消息循环中。然后,“GUI消息线程”不再知道该控件,并且不再向其传递消息。那些控制变得“流氓”;程序和Windows都无法告诉控件移动,重绘或离开。 Windows在此时“控制”窗口所能做的唯一事情就是关闭拥有它的进程,从而终止整个程序。

为了避免这种情况,GUI控件有一个特殊的方法“Invoke”(以及一个异步表兄“BeginInvoke”),用于从GUI消息传递线程外部使用。这些方法基本上通过Windows消息循环从窗口向自身发送消息,导致主GUI线程执行Invoke调用中指定的委托。通过这样做,主GUI线程将知道在该代码内部或由于该代码而创建的任何新GUI对象。

答案 1 :(得分:1)

在自定义线程中创建句柄时,自定义线程可以拥有句柄。实际上我不认为你可以切换手柄的所有者。分享也不可能。

线程可以同时拥有多个句柄。

答案 2 :(得分:0)

每个窗口都由创建窗口的线程拥有。许多窗口操作只能在该线程上执行,因此有一种机制可以确保代码在窗口的线程上执行。

Forms.Invoke就是这样一种机制。