获取当前执行线程的TThread对象?

17

我希望有一个类似 GetCurrentThread 的函数,可以返回当前执行线程的 TThread 对象。我知道有一个 Win32 API 调用 GetCurrentThread,但它只返回线程 ID。如果有可能从该 ID 获取 TThread 对象,那也可以。

6个回答

25

从你的回答中看来,你似乎只想“确定是否在主线程中运行”,如果是这样,你可以直接使用

if Windows.GetCurrentThreadId() = System.MainThreadID then
// ...

如果由工作线程加载,那么使用Delphi创建的DLL将无法运行。


23

Delphi最新版本——Delphi 2009,在TThread类中新增了一个CurrentThread类属性。

如果它是原生线程,它将返回正确的Delphi线程对象。如果线程是“外来”线程,即使用其他机制创建的线程或来自第三方线程的回调,则它将在线程句柄周围创建一个包装线程。


很不幸,CurrentThread存在严重缺陷,使其无用:https://dev59.com/YnVC5IYBdhLWcg3wxEN1 - Roddy
5
@Roddy 和未来的读者们:这个问题在2009年的一个补丁中得到了修复,并在2010年发布的版本中解决了。 - David
1
@DavidM - 感谢你,是的,在D2010中已经修复。D2009需要从其他问题链接中获取(非官方)补丁 - D2009的官方更新都没有解决这个问题。 - Roddy

4
我正在使用自己的TThread派生类,该类将自己注册在全局列表中并受到锁的保护。
这样,该派生类中的一个方法可以遍历该列表并获取给定ID的TThread。

0
回答自己的问题。我猜从ID获取TThread对象是不可能的。可以通过使用全局变量来实现。然后比较其句柄和当前线程ID,就可以确定是否在主线程中运行。

0

当前正在执行的线程不是您尝试从中运行函数的线程吗?


0

你可以通过调用TlsSetValue API将TThread实例的指针存储在当前线程的上下文中,然后使用TlsGetValue检索它。但是,请注意,这仅适用于尝试检索/存储当前线程的TThread实例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接