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

时间:2008-09-30 23:22:09

标签: multithreading delphi

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

6 个答案:

答案 0 :(得分:23)

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

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

虽然如果它是由工作线程加载的,但是使用Delphi创建的DLL不起作用。

答案 1 :(得分:21)

最新版本的Delphi,Delphi 2009,在TThread类上有一个CurrentThread类属性。

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

答案 2 :(得分:4)

我正在使用我自己的TThread后代,它将自己注册到一个全局列表中,并使用锁定进行保护。

这样,这个后代中的方法可以遍历列表并获得TThread给出ID。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

当前正在执行的线程不是您尝试运行函数的那个​​吗?

答案 5 :(得分:0)

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