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

本文关键字:句柄 其他 拥有 线程 | 更新日期: 2023-09-27 18:16:28

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

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

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

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

:

Handle | Thread-Handle-Reference

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对象。

自定义线程可以在自定义线程中创建句柄。事实上,我不认为你可以切换手柄的主人。共享也不应该是可能的。

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

每个窗口都由创建该窗口的线程拥有。许多窗口操作只能在该线程上执行,所以有一个机制来确保代码在窗口的线程上执行是很重要的。

形式。调用就是这样一种机制。