获取当前执行线程的TThread对象?
时间:2020-03-06 14:57:14 来源:igfitidea点击:
我想要一个类似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后代,该后代将自己注册在受锁保护的全局列表中。
这样,此后代中的方法就可以遍历列表并获得TThread赋予ID。