2012-03-13 4 views
5

У меня есть приложение Windows, в котором работает какое-то дорогое оборудование; это приложение умирает разнообразными творческими способами. Обычно, когда это происходит, процесс полностью умирает. Я написал небольшую программу мониторинга, которая ищет имя процесса в списке вещей, которые в настоящее время работают, и это отлично работает для этих сбоев. Но иногда он просто становится полностью невосприимчивым и требует завершения через диспетчер задач, но все еще «работает» в некотором бесполезном смысле.Проверка «живой» приложения Windows?

Я совершенно не знаком с Windows API, так что это, возможно, довольно растянуто, но есть ли что-нибудь, что я могу сделать, чтобы программно проверить «живучесть» других процессов? Или что я могу использовать, чтобы делать догадки? (Наблюдая за тем, чтобы он прекратил обработку событий из ОС или для полного доступа к диску/распределения памяти для остановки и т. Д. И т. Д.)

Предпочтительно, это было бы что-то, что я мог бы сделать с помощью модуля win32 для Python, но я отвечу на все, что может успешно обнаружить, когда эта вещь закроется. И я понимаю, что «живучесть» неясна, но я не хочу ничего из этого делать, особенно когда у меня нет никакого представления о том, как эта вещь действительно терпит неудачу.

+0

дорогая техника ?? Что это такое? Я также думаю, что вы должны решить свою проблему изнутри, а не извне. –

+0

Если бы это был вариант, это было бы здорово, и я бы преследовал его. Это не вариант. Это вполне разумная проблема, так как мир полон закрытого программного обеспечения, на котором работают важные машины. На самом деле, я не хочу вдаваться в подробности о точном программном обеспечении или машине, потому что для меня нет поддержки. Крошечный риск того, что производитель может встревожить жалобы, просто не стоит удовлетворять ваше любопытство. Я только упомянул оборудование, чтобы мотивировать мое желание ответа и отложить предложения «просто использовать что-то другое». –

+0

Я думаю, что решение зависит от того, что именно висит. Если это окно, то предложение SecurityMatt звучит неплохо. В противном случае, я думаю, вам просто нужно «проверить» приложение, чтобы найти какое-то уведомление о том, что приложение отправляет сообщение «Я жив» или «Я собираюсь повесить». Если нить не была явно приостановлена, я не знаю какого-либо флага, о котором я знаю, что говорит о зависании потока (например, в бесконечном цикле). –

ответ

4

Я думаю, что лучший способ сделать это - использовать Process & Thread functions в WIN32 API. NB: вы можете легко вставлять код C++ в python. Вероятно, это потребует некоторого времени и терпения, и я не знаю большинства этих функций.

С другой стороны, есть подробный проект по Process Monitoring на Codeproject и Python WMI, обертка для WMI в Python, но помните WMI значительно медленно, и вы должны убедиться, что служба запущена на компьютере.

Возможно также, что у вас может быть send a message to the process, что приведет к тому, что процесс предоставит ответ или изменит его состояние, если он жив, а затем проверите это изменение в процессе в течение некоторого времени.

+1

Также проверьте функцию [NtQueryInformationThread] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684283 (v = vs.85).aspx) и [GetThreadPendingIoFlag Function.] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms683234 (v = vs.85) .aspx) –

+0

Отправка сообщения с помощью SendMessageTimeout, по-видимому, обнаруживает по крайней мере, самые распространенные формы замораживания, с которыми мы сталкивались. –

3

Вам нужно будет получить дескриптор HWND в соответствующее окно (EnumWindowHandles может быть хорошим началом), а затем попробуйте вызвать IsHungAppWindow, чтобы узнать, не считает ли система, что она не отвечает.

Смежные вопросы