Некий процесс должен висеть в фоне, но криво написан и периодически виснет или вылетает. Нужен "пастух", который следил бы за ним, тыцал бы на капу "ОК" и перезапускал бы лентяя. Это несложно сделать самому, и почти уже готово, но: 1) Как догадаться, что процесс не вылетел, а повис? 2) Кстати, может быть я напрасно трачу время и есть готовые "пастухи" (KillBusy не предлагать) ?
Зависший процесс не мой. Это какой-та чужая фоновая хрень, которая проверяет почту, роется в базах данных и т.п. Моя задача - чтобы когда этот гад вылетел, запустить его вновь автоматицки.
Проще будет повесить калбек ... через PsSetCreateProcessNotifyRoutine. В винде есть функция проверки отзывчивости процесса. Но можна и по капшену окна мониторить ... [add] Вспомнил - IsHungAppWindow.
Поток следит за завершением процесса и запускает его в случае ошибки 1. получаешь описатель процесса hProcess=OpenProcess,SYNCHRONIZE,... 2. Ждешь когда он завершится WaitForSingleObject,hProcess,-1, когда процесс завершается процедура WaitForSingleObject возвращает управление 3. Закрываешь описатель CloseHandle,hProcess 4. Запускаешь процесс снова или надо как-то поставить обработчик исключений вместо стандартного виндосовского
могу предложить изврат. Если процесс имеет окно, имеет и оконнную процедуру. Инжектни в начало этой процедуры код типа jmp xxxxx на какойи нить свой кусок кода в данном процессе, который там к примеру флаг периодически выставляет и сбрасывает или время устанавливает последнего вызоа оконной функции. Таким образом будешь знать, обрабатывает ли процесс оконные сообщения или нет. Насколько мне известно, система отслеживает зависания гуишных процессов посылкой сообщения типа Wm_quit и затем проверяет через промежуток времени, не исчез ли процесс, если не исчез, то вызывается TerminateProcess, значит гуишный поток окна процесса, которому передали сообщение не обрабатывает сообщения.
CARDINAL А зачем эти все движения телом ? Если можно дёрнуть IsHungAppWindow и винда всё сама зделает ?))
n2k об этом я тоже думал, может я чего не знаю, но, где гарантии что данный обработчик сообщения есть в проге?
я заставлял все окна реагировать примерно так: SendMessage, HWND_BROADCAST, WM_SYSCOMMAND, -123456789, 0 реагируют все.
Well done. Пастух получился примитивный, но эффективный, что от него и требовалось. Всем спасибо за обсуждение и полезные советы.