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服务器。 –