Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > GetCurrentThread() возвращает INVALID_HANDLE


Автор: Alexeis 15.4.2010, 12:22
Создаю поток спящим, затем стартую. Внутри функции потока вызываю GetCurrentThread()

Код

void __fastcall CTaskManager::Execute(void)
{
    ThrHandle  = ::GetCurrentThread();
....


получаю значение хэндла 0xFFFFFFFE  smile 

Значит процесс 32х разрядный на Windows 7 x64

В документации вообще не описано что функция может давать ошибку
Цитата(http://msdn.microsoft.com/en-us/library/ms683182%28v=VS.85%29.aspx)

Return Value

The return value is a pseudo handle for the current thread.


Но на практике такие вот чудеса. 

При этом функция ::GetCurrentThreadId() работает нормально и возвращает правильный ID .

Я думал, что функция GetCurrentThread() просто возвращает значение из внутренней структуры описателя потока.

Автор: Alca 15.4.2010, 12:27
Цитата

INVALID_HANDLE_VALUE != 0xFFFFFFFE
INVALID_HANDLE_VALUE == 0xFFFFFFFF


Автор: GremlinProg 15.4.2010, 12:28
это не ошибка, это просто спец значение, которое обозначает текущий поток,
точно так же обстоят дела и с GetCurrentProcess

просто нет смысла искать подходящий дескриптор всякий раз при вызове GetCurrentxxx,
он будет приложен один раз, когда действительно будет нужен

Добавлено через 2 минуты и 21 секунду
ключевое слово: pseudo handle

Автор: Alexeis 15.4.2010, 12:32
Цитата(GremlinProg @  15.4.2010,  11:28 Найти цитируемый пост)
это не ошибка, это просто спец значение, которое обозначает текущий поток,
точно так же обстоят дела и с GetCurrentProcess

  При этом оно не совпадает со значением которое возвращает CreateThread при создании потока. 

  

Автор: Earnest 15.4.2010, 12:33
Так он же "псевдо". Это значение нельзя использовать в другом потоке.

Автор: Alexeis 15.4.2010, 12:42
Цитата(Earnest @  15.4.2010,  11:33 Найти цитируемый пост)
Так он же "псевдо". Это значение нельзя использовать в другом потоке. 

  Выходит что GetCurrentThread() не имеет ничего общего со значением возвращаемым CreateThread() . Спасибо. Буду знать.

Автор: xvr 15.4.2010, 14:15
Функция GetCurrentThread() предназначенна для передачи в другие функции HANDLE'а текущего потока. Как правильно заметил GremlinProg она возвращает константу. При использовании ВНУТРИ потока HANDLE'ы от GetCurrentThread и CreateThread будут обозначать одно и то же
Если нужен реальный HANDLE, то можно позвать DuplicateHandle на результат GetCurrentThread 

Автор: Alexeis 15.4.2010, 14:55
Цитата(xvr @  15.4.2010,  13:15 Найти цитируемый пост)
Если нужен реальный HANDLE, то можно позвать DuplicateHandle на результат GetCurrentThread 

  Т.е. по ходу функция CreateThread для возврата значения предварительно вызывает DuplicateHandle , поэтому значения дескрипторов и отличаются.

Автор: Mr_Devil 13.4.2012, 14:37
Код

...

var
FMainTheradHandle: THandle;

...

  DuplicateHandle(
    GetCurrentProcess,
    GetCurrentThread,
    GetCurrentProcess,
    @FMainTheradHandle,
    0, False, DUPLICATE_SAME_ACCESS);


В FMainTheradHandle получаем реальный HANDLE который можно передавать куда угодно и кому угодно. Полученный реальный HANDLE нужно будет обязательно закрыть (CloseHandle) после использования, в отличие от псевдохэндлов, которые закрывать не нужно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)