![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
Alexeis |
|
||||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Создаю поток спящим, затем стартую. Внутри функции потока вызываю GetCurrentThread()
получаю значение хэндла 0xFFFFFFFE ![]() Значит процесс 32х разрядный на Windows 7 x64 В документации вообще не описано что функция может давать ошибку
Но на практике такие вот чудеса. При этом функция ::GetCurrentThreadId() работает нормально и возвращает правильный ID . Я думал, что функция GetCurrentThread() просто возвращает значение из внутренней структуры описателя потока. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||
|
|||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 5 Всего: 50 |
Это сообщение отредактировал(а) Alca - 15.4.2010, 12:28 |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
это не ошибка, это просто спец значение, которое обозначает текущий поток,
точно так же обстоят дела и с GetCurrentProcess просто нет смысла искать подходящий дескриптор всякий раз при вызове GetCurrentxxx, он будет приложен один раз, когда действительно будет нужен Добавлено через 2 минуты и 21 секунду ключевое слово: pseudo handle -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
При этом оно не совпадает со значением которое возвращает CreateThread при создании потока. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Так он же "псевдо". Это значение нельзя использовать в другом потоке.
-------------------- ... |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Выходит что GetCurrentThread() не имеет ничего общего со значением возвращаемым CreateThread() . Спасибо. Буду знать. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Функция GetCurrentThread() предназначенна для передачи в другие функции HANDLE'а текущего потока. Как правильно заметил GremlinProg она возвращает константу. При использовании ВНУТРИ потока HANDLE'ы от GetCurrentThread и CreateThread будут обозначать одно и то же
Если нужен реальный HANDLE, то можно позвать DuplicateHandle на результат GetCurrentThread |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Т.е. по ходу функция CreateThread для возврата значения предварительно вызывает DuplicateHandle , поэтому значения дескрипторов и отличаются. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Mr_Devil |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 22.3.2007 Репутация: нет Всего: нет |
В FMainTheradHandle получаем реальный HANDLE который можно передавать куда угодно и кому угодно. Полученный реальный HANDLE нужно будет обязательно закрыть (CloseHandle) после использования, в отличие от псевдохэндлов, которые закрывать не нужно. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |