Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать, запущен ли поток? 
:(
    Опции темы
Altern
Дата 2.4.2006, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 30.3.2006

Репутация: нет
Всего: нет



Здравствуйте. У меня вопрос. Как узнать, запущен ли поток? То есть он бывает в трех состояниях: запущен, остановлен и приостановлен(Suspended). Когда поток остановлен, то его Handle равен NULL. А как различить остальные два состояния - приостановлен он или выполняется?

Заранее спасибо
PM MAIL   Вверх
Romikgy
Дата 3.4.2006, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 7
Всего: 146



ResumeThread
If the function succeeds, the return value is the thread's previous suspend count.
If the suspend count is 0, the thread is not currently suspended.
SuspendThread
If the function succeeds, the return value is the thread's previous suspend count


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Earnest
Дата 3.4.2006, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Цитата(Altern @ 2.4.2006, 14:28 Найти цитируемый пост)
Когда поток остановлен, то его Handle равен NULL.

Ничего подобного. Кто, интересно, хандл обнулит? Хандл остается валидным, пока его не закроет CloseHandle. И нужно вызвать функцию GetExitCodeThread, чтобы узнать, завершился ли поток. Или использовать WaitForSingleObject (c нулевым таймаутом)
Что касается состояния suspend-resume, то прямой функции я не знаю, но можно попробовать вызвать suspend, (а потом снова resume, чтобы не менять состояния), и по возвращенному suspend значению понять, стоит процесс или работает.



--------------------
...
PM   Вверх
NiJazz
Дата 5.4.2006, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 6
Всего: 23



Earnest, и что же должна вернуть GetExitCodeThread??
PM MAIL   Вверх
Romikgy
Дата 5.4.2006, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 7
Всего: 146



Цитата(NiJazz @ 5.4.2006, 08:26 Найти цитируемый пост)
GetExitCodeThread

один из вариантов smile
Код

BOOL GetExitCodeThread(

    HANDLE hThread,    // handle to the thread 
    LPDWORD lpExitCode    // address to receive termination status 
   );
lpExitCode

Points to a 32-bit variable to receive the thread termination status. 
If the specified thread has not terminated, the termination status returned is STILL_ACTIVE. If the thread has terminated, the termination status returned may be one of the following: 

·    The exit value specified in the ExitThread or TerminateThread function. 
·    The return value from the thread function. 
·    The exit value of the thread's process. 



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
NiJazz
Дата 5.4.2006, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 6
Всего: 23



Romikgy, может, подкинешь примерчик, с чем ты сравниваешь exit code, чтобы определить состояние потока?
Добавлено @ 12:20
Romikgy,
Цитата

If the specified thread has not terminated, the termination status returned is STILL_ACTIVE.

Сорри, бываю невнимателен. smile
PM MAIL   Вверх
Romikgy
Дата 5.4.2006, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 7
Всего: 146



Цитата(NiJazz @ 5.4.2006, 11:19 Найти цитируемый пост)
бываю невнимателен.

отож smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
lemax
Дата 11.6.2008, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 14.10.2007

Репутация: нет
Всего: 1



Цитата(Earnest @ 3.4.2006,  19:57)
Цитата(Altern @  2.4.2006,  14:28 Найти цитируемый пост)
Когда поток остановлен, то его Handle равен NULL.

И нужно вызвать функцию GetExitCodeThread, чтобы узнать, завершился ли поток. Или использовать WaitForSingleObject (c нулевым таймаутом)

WaitForSingleObject в случае успеха захватывает HANDLE?
Нужно ли его высвободить, или ,все таки, WaitForSingleObject не может изменить состояние на захваченный?
PM MAIL   Вверх
EnergoHokum
Дата 11.6.2008, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: 3
Всего: 6



Функции ожидания (по моим экспериментам) захватывают только объекты синхронизации: защёлки, семафоры, события. Для handle потока WaitForSingleObject(threadHandle,0) всего-лишь проверит, завершился-ли он уже, или нет. Handle всего того, что не является объектами синхронизации освобождать после проверки нет необходимости.
PM MAIL ICQ   Вверх
lemax
Дата 11.6.2008, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 14.10.2007

Репутация: нет
Всего: 1



Цитата(EnergoHokum @ 11.6.2008,  13:25)
Функции ожидания (по моим экспериментам) захватывают только объекты синхронизации: защёлки, семафоры, события. Для handle потока WaitForSingleObject(threadHandle,0) всего-лишь проверит, завершился-ли он уже, или нет. Handle всего того, что не является объектами синхронизации освобождать после проверки нет необходимости.

Спасибо. А то в документации ни слова про это
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1774 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.