Автор
|
Тема: Проверка "зависания" потока - нужна идея.
|
michl_m |
опубликован 29-01-2002 13:57 MSK
У меня несколько рабочих потоков. Доступ полный - есть HANDLE и ID каждого. Каждый поток получает запрос и посылает сигнал о выполнении. Есть главный поток. Он знает: запрос послан потоку 1, ответа нет давно. Как проверить, не завис ли поток 1?
|
Muran
|
опубликован 29-01-2002 16:40 MSK
У меня была для каждого потока переменная int и каждый поток её изменял th1++,th2++ и.т.д. Соответственно если послан запрос а ответа нет проверяешь два значения одной переменной Если не изменяется то поток висит. |
One
|
опубликован 29-01-2002 16:55 MSK
Проверить, не завис ли процесс, можно стандартными средствами WinAPI. Вот здесь http://www.rsdn.ru/qna/?baseserv/killproc.xml есть тестовое приложение, в котором процессы проверяются на зависание. |
klep
|
опубликован 29-01-2002 17:21 MSK
А если поставить обработчик сообщений WM_USER в потоке. А из главного потока посылать сообщение. Когда обработчик получит сообщение он сгенерит в ответ сообщ. таким образом будет ясно что поток не висит иначе после таймаута убиваем поток.
|
stan
|
опубликован 29-01-2002 21:25 MSK
Я тут давеча писал простую прогу для определения зависания. Алгоритм простой - регистрируешь месагу, потом каждый, кто хочет проверяться на зависание, шлет ее твоему окну (класс окна известен). Если он долго не шлет сообщение и сам не уничтожился, то его снимают TerminateProcess(я не слал WM_QUIT или WM_CLOSE, так как в моей задаче окна у процесса заведомо не было) |
Flex Ferrum
|
опубликован 29-01-2002 21:51 MSK
Поищи по этому и по iXBT'шному форуму (по программированию). Буквально в течении месяца эта тема поднималась. Есть две апишные функции, которые определяют - подвис поток (и процесс) или нет. Как они зовуться - хоть убей не помню. |
Serus
|
опубликован 29-01-2002 23:30 MSK
Есть одна очень хорошая функция - WaitForSingleObject(). Вызываеш ее из главного потока:DWORD ret = WaitForSingleObject(HANDLE_процесса, 0); if(ret == WAIT_TIMEOUT) поток выполняется else поток либо завершен либо SUSPENDED К сожалению, даная функция не определяет програмного зависания потока (например, безконечный цикл)
|
Serus
|
опубликован 29-01-2002 23:33 MSK
Ошибка :-) Вместо HANDLE_процесса нужно передовать HANDLE_потока который хотим проверить. |
michl_m
|
опубликован 30-01-2002 19:00 MSK
Всем большое спасибо. Теперь буду думать, что лучше. |
stan
|
опубликован 31-01-2002 16:39 MSK
IsHungAppWindow в user32.dll. Сам я ее не использовал, но как мне кажется, она просто проверяет, обрабатывало ли окно сообщение в течение последних n секунд. А окно у приложения есть далеко не всегда. |
stan
|
опубликован 31-01-2002 16:42 MSK
IsHungAppWindow в user32.dll. Сам я ее не использовал, но как мне кажется, она просто проверяет, обрабатывало ли окно сообщение в течение последних n секунд. А окно у приложения есть далеко не всегда. |
ADK
|
опубликован 01-02-2002 06:59 MSK
Действительно, по-моему, на RSDN.RU всё подробно объяснялось. И в 9x, и в NT есть стандартные функции, причём одна из них не требет наличия у потока очереди сообщений. А вообще можно юзать SendMessageTimeout |