Получить объект TThread для текущего выполняющегося потока? - PullRequest
15 голосов
/ 01 октября 2008

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

Ответы [ 6 ]

23 голосов
/ 01 октября 2008

Судя по вашему собственному ответу, возможно, вы хотите только «определить, работает ли в основном потоке или нет», и в этом случае вы можете просто использовать

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

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

21 голосов
/ 01 октября 2008

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

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

4 голосов
/ 01 октября 2008

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

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

0 голосов
/ 01 октября 2008

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

0 голосов
/ 01 октября 2008

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

0 голосов
/ 01 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...