Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > GetCurrentThread() возвращает INVALID_HANDLE |
Автор: Alexeis 15.4.2010, 12:22 | ||||
Создаю поток спящим, затем стартую. Внутри функции потока вызываю GetCurrentThread()
получаю значение хэндла 0xFFFFFFFE ![]() Значит процесс 32х разрядный на Windows 7 x64 В документации вообще не описано что функция может давать ошибку
Но на практике такие вот чудеса. При этом функция ::GetCurrentThreadId() работает нормально и возвращает правильный ID . Я думал, что функция GetCurrentThread() просто возвращает значение из внутренней структуры описателя потока. |
Автор: Alca 15.4.2010, 12:27 | ||
|
Автор: GremlinProg 15.4.2010, 12:28 |
это не ошибка, это просто спец значение, которое обозначает текущий поток, точно так же обстоят дела и с GetCurrentProcess просто нет смысла искать подходящий дескриптор всякий раз при вызове GetCurrentxxx, он будет приложен один раз, когда действительно будет нужен Добавлено через 2 минуты и 21 секунду ключевое слово: pseudo handle |
Автор: Earnest 15.4.2010, 12:33 |
Так он же "псевдо". Это значение нельзя использовать в другом потоке. |
Автор: Alexeis 15.4.2010, 12:42 | ||
Выходит что GetCurrentThread() не имеет ничего общего со значением возвращаемым CreateThread() . Спасибо. Буду знать. |
Автор: xvr 15.4.2010, 14:15 |
Функция GetCurrentThread() предназначенна для передачи в другие функции HANDLE'а текущего потока. Как правильно заметил GremlinProg она возвращает константу. При использовании ВНУТРИ потока HANDLE'ы от GetCurrentThread и CreateThread будут обозначать одно и то же Если нужен реальный HANDLE, то можно позвать DuplicateHandle на результат GetCurrentThread |
Автор: Alexeis 15.4.2010, 14:55 | ||
Т.е. по ходу функция CreateThread для возврата значения предварительно вызывает DuplicateHandle , поэтому значения дескрипторов и отличаются. |
Автор: Mr_Devil 13.4.2012, 14:37 | ||
В FMainTheradHandle получаем реальный HANDLE который можно передавать куда угодно и кому угодно. Полученный реальный HANDLE нужно будет обязательно закрыть (CloseHandle) после использования, в отличие от псевдохэндлов, которые закрывать не нужно. |