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

Multithreading 获取当前正在执行的线程的TThread对象?,multithreading,delphi,Multithreading,Delphi,我想要一个像GetCurrentThread这样的函数,它返回当前执行线程的TThread对象。我知道有一个Win32 API调用GetCurrentThread,但它返回线程Id。如果有可能从该Id获取TThread对象,也可以。回答我自己的问题。我猜不可能从ID获取TThread对象。可以使用全局变量。然后比较其句柄和当前线程id,您可以确定是否在主线程中运行。当前执行的线程不是您试图从中运行函数的线程吗?您可以通过TlsSetValue API调用将TThread实例的指针存储在当前线程的

我想要一个像GetCurrentThread这样的函数,它返回当前执行线程的TThread对象。我知道有一个Win32 API调用GetCurrentThread,但它返回线程Id。如果有可能从该Id获取TThread对象,也可以。

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

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

您可以通过TlsSetValue API调用将TThread实例的指针存储在当前线程的上下文中,然后使用TlsGetValue检索它。但是,请注意,只有当您试图检索/存储当前线程的TThread实例时,这才起作用。

根据您自己的回答,似乎您只想“确定是否在主线程中运行”,在这种情况下,您可以使用

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

虽然如果由工作线程加载,则无法从使用Delphi创建的DLL中执行此操作。

Delphi的最新版本Delphi 2009在TThread类上具有CurrentThread类属性


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

我正在使用自己的TThread子代,该子代将自己注册到一个全局列表中,并受到锁的保护


这样,此子代中的方法可以遍历列表并获取给定ID的TThread。

不幸的是,CurrentThread有一个严重的缺陷使其无法使用:CurrentThread-and-eaccessviolation-is-this-a-bug-or-my-incompete@Roddy对于未来的读者:这在2009年通过补丁修复,并在2010年发布。@DavidM-谢谢-是的,固定在D2010。D2009需要从另一个问题链接的(非官方)补丁-D2009官方更新均未解决此问题。