Нужно опредлить что приложение висит, и перезапустить его оно повисло. Интересуют способы определения... Приложения не мои.
Дурные идеи с поиском окошка в котором есть "(Приложение неотвечает)" итп.. непредлагать...
Есть идея внедрить длл в АП чужого приложения, в которой будет реализована связь с моей прогой, через какие нибуть механизмы обмена данными между процессами... Например моя длл будет через определённое время обновлять значение симафора, итп.. это нестоль важно, как нибуть придумаю... Так вот, если приложение виснит, пролучается что виснит и моя длл, симафор необновляется, и прога что контролирует работу процесса, фиксирует зависание, и перезапускает процесс.
Вопросы:
1) Получится ли это? (без учёта кривости моих рук :) это чисто теоретический вопрос)
2) Как быть с многопоточными приложениями? Если внедрить длл в 1 поток в приложение, то этот поток может быть просто приостановлен пока работает другой. Чё, внедрять длл во все потоки? :\ В этом косяк.
Ну и вообще, с радостью выслушаю предложения как реализовать сабж другими способами.
Когда приложение висит, оно вроде жрет много ресурсов? Или это не всегда? Хз, надо выяснять
В общем предлагаю смотреть на процесс и инфу о нем... Куда-нибудь в эту сторону копать Должна быть, имхо, какая-нибудь инфа о процессе, которая "реагирует", когда приложение виснет, может перестает обновляться что-нибудь может еще что.
Я думаю нельзято 4но узнать висит ли програма по данным из ОС.
Например долгое зацикливание в VB системой видитса как зависание.Прога чтото щитает, а ее спешат кикнуть.
Когда приложение висит, оно вроде жрет много ресурсов?
- Когда оно не висит оно тоже может жрать много ресурсов.
HACKER, если ты сможешь узнать hWnd окна приложения которое может зависнуть (ИМХО для тебя это не проблема ), то предлагаю такой вариант:
На сколько я знаю, когда приложение висит, то оно на WM_ACTIVATE не отвечает, а когда не висит, то отвечает 1. Так вот, почему бы это не использовать? Правда тут есть одна проблема: то приложение, которое посылает "висяку" сообщение тоже повисает, до принятия ответа. Какой выход?
Думается, что в принципе можно создать прогу, кот. будет как бы посредником между потенциальным висяком и твоей следящей программой. Т.е. прога через определенные промежутки времени (например через 1с) будет посылать висяку WM_ACTIVATE и если ей удастся получить ответ, то она пошлет твоей следящей программе какое - нибудь сообщение (ну типа WM_USER+...),а если висяк все таки повиснет, то следящая программа долгое время не будет получать WM_USER+... и придет к выводу, что обе проги (висяк и посредник) зависли, а соответственно их нужно TerminateProcess, а потом снова ShelExecute.
Ну думаю, что идея ясна
Конечно, может быть, что всё на много проще можно организовать, но мне в данный момент ничего лучше в голову не пришло, а если придет - напишу ))
Так вот, если приложение виснит, пролучается что виснит и моя длл, симафор необновляется, и прога что контролирует работу процесса, фиксирует зависание, и перезапускает процесс.
Если программа ушла в дедлок, твой поток будет нормально работать, хотя по всем признакам это именно зависание.
Чё, внедрять длл во все потоки?
/me насторожилсйо. Как ты предлагаешь внедрять DLL во все потоки?
По идее, программа висит, если она не реагирует на внешние раздражители (сообщения) достаточно долгое время. В принципе, окно не обязательно, если есть используемый по назначению цикл обработки сообщений. Если перехватить этот самый цикл, то можно, скажем, отследить паузу между поступлением сообщения в очередь сообщений и извлечением этого сообщения с помощью GetMessage. Если пауза нехорошо длинна, можно считать, что программа зависла (или криво работает). С другой стороны, программа может и обрабатывать сообщения, а повиснуть - ее рабочий поток
А вообще эта задача не имеет решения Попробуйте доказать, повиснет ли программа, которая перебирает все натуральные вектора размера 3 (предположим, что числа могут быть бесконечными) и проверяет, является ли v0^(v2+2) + v1^(v2+2) (v2+2)-й степенью некоторого натурального числа. Если является, выходит.
You call the IsHungAppWindow function to determine if Microsoft Windows considers that a specified application is not responding, or "hung". An application is considered to be not responding if it is not waiting for input, is not in startup processing, and has not called PeekMessage within the internal timeout period of 5 seconds.
2) Как быть с многопоточными приложениями? Если внедрить длл в 1 поток в приложение, то этот поток может быть просто приостановлен пока работает другой. Чё, внедрять длл во все потоки? :\ В этом косяк.
Полный бред. DLL можно внедрить в процесс, а не в отдельный поток.