【问题标题】:Can a thread own other handles?线程可以拥有其他句柄吗?
【发布时间】:2011-12-01 18:29:07
【问题描述】:

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

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

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

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

喜欢:

手柄 |线程句柄引用

3201 | 20

4882 | 20

4827 | 7

【问题讨论】:

  • 到底是什么问题?如果自定义线程可以拥有其他线程,例如窗户把手?
  • 托管线程不一定直接映射到操作系统线程,它取决于主机,我认为.net CLR主机管理它的方式与sql server不同。

标签: c# windows


【解决方案1】:

在这些方面,是的。

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

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

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

【讨论】:

  • 哇! - 这确实清除了很多东西 - 谢谢! - main program execution threadGUI messaging thread 是同一个线程吗?
  • 几乎总是这样。可以将不同的线程附加到 Windows 消息循环,但很少这样做。它可能很有用,但你必须非常小心。
  • @KeithS:我认为退潮是在询问是否可以从应用程序主线程以外的线程创建窗口。这样做非常简单(尽管您需要注意 main() 直到窗口线程关闭后才会返回)。
  • 是的,您可以在不同的线程中创建表单或您能想到的任何其他控件。这使得创建控件的线程成为 GUI 线程,并且当该线程进行第一次 GDI 调用时,将为该线程创建一个消息泵。但是,代码中句柄的所有权和表单对象的所有权是两个非常不同的东西,一个并不意味着另一个。如果后台线程创建了一个新控件,那么只要该控件存在,该线程就必须继续运行,否则当线程停止时它将变得“流氓”。后台线程通常是短暂且单一用途的
  • 另外,虽然一个窗体可能在其子控件树中有一个特定的控件,但如果该控件是由另一个线程创建的,窗体的线程可能不会直接作用于该控件(您会导致“跨线程异常");每次必须运行更改控件状态的代码时,它都必须在该控件上调用 Invoke。
【解决方案2】:

当在自定义线程中创建句柄时,自定义线程可以拥有句柄。其实我不认为你可以切换手柄的所有者。共享应该也是不可能的。

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-08-02
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多