WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Проверка "зависания" потока - нужна идея.

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Проверка "зависания" потока - нужна идея.
michl_m опубликован 29-01-2002 13:57 MSK   Click Here to See the Profile for michl_m   Click Here to Email michl_m  
У меня несколько рабочих потоков. Доступ полный - есть HANDLE и ID каждого. Каждый поток получает запрос и посылает сигнал о выполнении.
Есть главный поток. Он знает: запрос послан потоку 1, ответа нет давно. Как проверить, не завис ли поток 1?
Muran опубликован 29-01-2002 16:40 MSK     Click Here to See the Profile for Muran  Click Here to Email Muran     
У меня была для каждого потока переменная int
и каждый поток её изменял th1++,th2++ и.т.д.
Соответственно если послан запрос а ответа нет
проверяешь два значения одной переменной
Если не изменяется то поток висит.
One опубликован 29-01-2002 16:55 MSK     Click Here to See the Profile for One  Click Here to Email One     
Проверить, не завис ли процесс, можно стандартными средствами WinAPI. Вот здесь http://www.rsdn.ru/qna/?baseserv/killproc.xml есть тестовое приложение, в котором процессы проверяются на зависание.
klep опубликован 29-01-2002 17:21 MSK     Click Here to See the Profile for klep  Click Here to Email klep     
А если поставить обработчик сообщений WM_USER
в потоке.
А из главного потока посылать сообщение.
Когда обработчик получит сообщение он сгенерит в ответ сообщ. таким образом будет ясно что поток не висит иначе после таймаута убиваем поток.
stan опубликован 29-01-2002 21:25 MSK     Click Here to See the Profile for stan  Click Here to Email stan     
Я тут давеча писал простую прогу для определения зависания. Алгоритм простой - регистрируешь месагу, потом каждый, кто хочет проверяться на зависание, шлет ее твоему окну (класс окна известен). Если он долго не шлет сообщение и сам не уничтожился, то его снимают TerminateProcess(я не слал WM_QUIT или WM_CLOSE, так как в моей задаче окна у процесса заведомо не было)
Flex Ferrum опубликован 29-01-2002 21:51 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
Поищи по этому и по iXBT'шному форуму (по программированию). Буквально в течении месяца эта тема поднималась. Есть две апишные функции, которые определяют - подвис поток (и процесс) или нет. Как они зовуться - хоть убей не помню.
Serus опубликован 29-01-2002 23:30 MSK     Click Here to See the Profile for Serus    
Есть одна очень хорошая функция - WaitForSingleObject().
Вызываеш ее из главного потока:

DWORD ret = WaitForSingleObject(HANDLE_процесса, 0);

if(ret == WAIT_TIMEOUT)
поток выполняется
else
поток либо завершен либо SUSPENDED

К сожалению, даная функция не определяет програмного зависания потока (например, безконечный цикл)

Serus опубликован 29-01-2002 23:33 MSK     Click Here to See the Profile for Serus    
Ошибка :-)
Вместо HANDLE_процесса нужно передовать HANDLE_потока который хотим проверить.
michl_m опубликован 30-01-2002 19:00 MSK     Click Here to See the Profile for michl_m  Click Here to Email michl_m     
Всем большое спасибо. Теперь буду думать, что лучше.
stan опубликован 31-01-2002 16:39 MSK     Click Here to See the Profile for stan  Click Here to Email stan     
IsHungAppWindow в user32.dll. Сам я ее не использовал, но как мне кажется, она просто проверяет, обрабатывало ли окно сообщение в течение последних n секунд. А окно у приложения есть далеко не всегда.
stan опубликован 31-01-2002 16:42 MSK     Click Here to See the Profile for stan  Click Here to Email stan     
IsHungAppWindow в user32.dll. Сам я ее не использовал, но как мне кажется, она просто проверяет, обрабатывало ли окно сообщение в течение последних n секунд. А окно у приложения есть далеко не всегда.
ADK опубликован 01-02-2002 06:59 MSK     Click Here to See the Profile for ADK  Click Here to Email ADK     
Действительно, по-моему, на RSDN.RU всё подробно объяснялось. И в 9x, и в NT есть стандартные функции, причём одна из них не требет наличия у потока очереди сообщений. А вообще можно юзать SendMessageTimeout

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.