Получить объект TThread для текущего исполняемого потока?

Мне нужна функция GetCurrentThread, которая возвращает объект TThread текущего исполняемого потока. Я знаю, что есть вызов Win32 API GetCurrentThread, но он возвращает идентификатор потока. Если есть возможность получить TThread-объект из этого идентификатора, который также прекрасен.

Ответы

Ответ 1

Последняя версия Delphi, Delphi 2009, обладает свойством класса CurrentThread в классе TThread.

Это вернет правильный поток потока Delphi, если он является родным потоком. Если поток является "чужой" нитью, т.е. Создан с использованием какого-либо другого механизма или обратного вызова из стороннего потока, тогда он создаст поток обертки вокруг дескриптора потока.

Ответ 2

Из вашего собственного ответа кажется, что вам нужно только "определить, работает ли в основном потоке или нет", и в этом случае вы можете просто использовать

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

Хотя это не будет работать с DLL, созданной с помощью Delphi, если она была загружена рабочим потоком.

Ответ 3

Я использую свой собственный потомок TThread, который регистрируется в глобальном списке, защищенном блокировкой.

Таким образом, метод в этом потомке может перемещаться по списку и получать TThread с идентификатором.

Ответ 4

Отвечая на мой вопрос. Я думаю, что невозможно получить TThread-объект из ID. Это возможно с помощью глобальной переменной. Затем, сравнивая его дескриптор и текущий идентификатор потока, можно определить, работает ли он в основном потоке или нет.

Ответ 5

Не будет ли текущий исполняемый поток быть тем, с которым вы пытаетесь запустить функцию?

Ответ 6

Вы можете сохранить указатель экземпляра TThread в текущем контексте потока через вызов API TlsSetValue, а затем извлечь его с помощью TlsGetValue. Однако обратите внимание, что это будет работать только в том случае, если вы пытаетесь получить/сохранить экземпляр TThread потока current.