Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Как определить что приложение висит? Добавлено: 20.04.07 18:12  

Автор вопроса:  HACKER
Нужно опредлить что приложение висит, и перезапустить его оно повисло. Интересуют способы определения... Приложения не мои.

Дурные идеи с поиском окошка в котором есть "(Приложение неотвечает)" итп.. непредлагать...

Есть идея внедрить длл в АП чужого приложения, в которой будет реализована связь с моей прогой, через какие нибуть механизмы обмена данными между процессами... Например моя длл будет через определённое время обновлять значение симафора, итп.. это нестоль важно, как нибуть придумаю... Так вот, если приложение виснит, пролучается что виснит и моя длл, симафор необновляется, и прога что контролирует работу процесса, фиксирует зависание, и перезапускает процесс.

Вопросы:
1) Получится ли это? (без учёта кривости моих рук :) это чисто теоретический вопрос)
2) Как быть с многопоточными приложениями? Если внедрить длл в 1 поток в приложение, то этот поток может быть просто приостановлен пока работает другой. Чё, внедрять длл во все потоки? :\ В этом косяк.


Ну и вообще, с радостью выслушаю предложения как реализовать сабж другими способами.

Ответить

  Ответы Всего ответов: 22  

Номер ответа: 1
Автор ответа:
 ISpy



Разработчик Offline Client

Вопросов: 47
Ответов: 621
 Web-сайт: intermult.boom.ru
 Профиль | | #1
Добавлено: 20.04.07 21:50
Когда приложение висит, оно вроде жрет много ресурсов? Или это не всегда? Хз, надо выяснять :)

В общем предлагаю смотреть на процесс и инфу о нем... Куда-нибудь в эту сторону копать ;) Должна быть, имхо, какая-нибудь инфа о процессе, которая "реагирует", когда приложение виснет, может перестает обновляться что-нибудь может еще что.

Ответить

Номер ответа: 2
Автор ответа:
 intel-DX



ICQ: 445091742 

Вопросов: 4
Ответов: 169
 Профиль | | #2 Добавлено: 20.04.07 22:42
Я думаю нельзято 4но узнать висит ли програма по данным из ОС.
Например долгое зацикливание в VB системой видитса как зависание.Прога чтото щитает, а ее спешат кикнуть.

Ответить

Номер ответа: 3
Автор ответа:
 Серёга



ICQ: 262809473 

Вопросов: 17
Ответов: 561
 Web-сайт: houselab.narod.ru
 Профиль | | #3
Добавлено: 20.04.07 22:58
Когда приложение висит, оно вроде жрет много ресурсов?

- Когда оно не висит оно тоже может жрать много ресурсов.

HACKER, если ты сможешь узнать hWnd окна приложения которое может зависнуть (ИМХО для тебя это не проблема :)), то предлагаю такой вариант:
На сколько я знаю, когда приложение висит, то оно на WM_ACTIVATE не отвечает, а когда не висит, то отвечает 1. Так вот, почему бы это не использовать? Правда тут есть одна проблема: то приложение, которое посылает "висяку" сообщение тоже повисает, до принятия ответа. Какой выход?
Думается, что в принципе можно создать прогу, кот. будет как бы посредником между потенциальным висяком и твоей следящей программой. Т.е. прога через определенные промежутки времени (например через 1с) будет посылать висяку WM_ACTIVATE и если ей удастся получить ответ, то она пошлет твоей следящей программе какое - нибудь сообщение (ну типа WM_USER+...),а если висяк все таки повиснет, то следящая программа долгое время не будет получать WM_USER+... и придет к выводу, что обе проги (висяк и посредник) зависли, а соответственно их нужно TerminateProcess, а потом снова ShelExecute.
Ну думаю, что идея ясна :)
Конечно, может быть, что всё на много проще можно организовать, но мне в данный момент ничего лучше в голову не пришло, а если придет - напишу :)))

Ответить

Номер ответа: 4
Автор ответа:
 User Unknown



Вечный Юзер!

ICQ: uu@jabber.cz 

Вопросов: 120
Ответов: 3302
 Профиль | | #4 Добавлено: 20.04.07 23:54
+1 к Серёге. Именно так это реализовано в Xorg.

Ответить

Номер ответа: 5
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #5 Добавлено: 21.04.07 00:26
хм, интересно, попробую...
А как быть если прога без окна? :)

Ответить

Номер ответа: 6
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #6 Добавлено: 21.04.07 01:39
SendMessageTimeout(WM_NULL)

А как быть если прога без окна? :)

Тогда нет способа определить, работает она или висит.

Ответить

Номер ответа: 7
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #7
Добавлено: 21.04.07 06:09
Так вот, если приложение виснит, пролучается что виснит и моя длл, симафор необновляется, и прога что контролирует работу процесса, фиксирует зависание, и перезапускает процесс.

Если программа ушла в дедлок, твой поток будет нормально работать, хотя по всем признакам это именно зависание.

Чё, внедрять длл во все потоки?

/me насторожилсйо. Как ты предлагаешь внедрять DLL во все потоки?

По идее, программа висит, если она не реагирует на внешние раздражители (сообщения) достаточно долгое время. В принципе, окно не обязательно, если есть используемый по назначению цикл обработки сообщений. Если перехватить этот самый цикл, то можно, скажем, отследить паузу между поступлением сообщения в очередь сообщений и извлечением этого сообщения с помощью GetMessage. Если пауза нехорошо длинна, можно считать, что программа зависла (или криво работает). С другой стороны, программа может и обрабатывать сообщения, а повиснуть - ее рабочий поток :)

А вообще эта задача не имеет решения :) Попробуйте доказать, повиснет ли программа, которая перебирает все натуральные вектора размера 3 (предположим, что числа могут быть бесконечными) и проверяет, является ли v0^(v2+2) + v1^(v2+2) (v2+2)-й степенью некоторого натурального числа. Если является, выходит.

Ответить

Номер ответа: 8
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #8 Добавлено: 21.04.07 10:33
с помощью GetMessage

XP SP2 так и определяет - ghost window появляется, если окно несколько секунд не вызывало GetMessage.

Ответить

Номер ответа: 9
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #9 Добавлено: 21.04.07 15:57
Спасибо GSerg
http://subscribe.ru/archive/comp.prog.visualc/200206/09181130.html

Ответить

Номер ответа: 10
Автор ответа:
 W[4Fh]LF



Вопросов: 0
Ответов: 187
 Web-сайт: hunger.ru
 Профиль | | #10
Добавлено: 21.04.07 16:10
Удивительно, что ниодин не предложил:

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 можно внедрить в процесс, а не в отдельный поток.

Ответить

Номер ответа: 11
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #11
Добавлено: 21.04.07 17:18
2W[4Fh]LF: спасибо, что поддержал, а то у меня чуть шарики за ролики не заехали, когда я себе попытался представить внедрение DLL в существующий поток :)

Ответить

Номер ответа: 12
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #12 Добавлено: 22.04.07 02:44
Ж) ок, про длл - я прогнал.

Можно прототип IsHungAppWindow? А то у мя в ApiViewer'e нема...

Ответить

Номер ответа: 13
Автор ответа:
 W[4Fh]LF



Вопросов: 0
Ответов: 187
 Web-сайт: hunger.ru
 Профиль | | #13
Добавлено: 22.04.07 08:42
BOOL IsHungAppWindow(HWND hWnd);



Return Value

Returns TRUE if the window stops responding, otherwise returns FALSE. Ghost windows always return TRUE.

Ответить

Номер ответа: 14
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #14 Добавлено: 22.04.07 11:02
Работает не ранее чем в W2k.

Ответить

Номер ответа: 15
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #15
Добавлено: 22.04.07 14:30
А MSDN из принципа не используешь? :)

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам