Способы мониторинга зависших и грузных приложений

Тема в разделе "WASM.WIN32", создана пользователем seiko, 21 авг 2008.

  1. seiko

    seiko New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    98
    Вопрос 1:
    Как система мониторит когда приложение зависло? Я слышал что окну отправляется timeout-сообщение, если время ожидания ответа превышено или ответ так и не был получен, то приложение признается зависшим, как можно в своей программе быстро реагировать на зависание других приложений? ну например с целью предложения их завершения (чтобы пользователь не лез в диспетчер задач)

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

    Вопрос 3 (немного не по теме):
    Какой параметер нужно передать в NtShutdownSystem из ntdll чтобы перезагрузить компьютер, а то у меня высвечивается окно выбора (Жд. режим, Выключение или Перезагрузка)?
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    seiko
    1) Мои мысли. Могу и ошибаться. Переписать виндовс. В часности систему планирования процессов. Другого выхода я не вижу.
    Для быстрой реакции нужен процесс с высшим приоритетом. Проблема может быть и в зависании драйвера. Так что лучши иметь драйвер с высшим приоритетом.

    2) Этот вопрос задают часто. Так что ответ можно легко найти.
    3) Незнаю, справку надо читать.
     
  3. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    WM_NULL
    WM_NULL Notification
    Но такое вроде бы только целесообразно при налиции GUI (окна и т.п.).
     
  4. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Microsoft рекомендует использовать для этого SendMessageTimeout(). Существует также ряд недокументированных функций, подробнее см. в статье Как определить, что приложение не отвечает?.

    Сие обсуждалось неоднократно, и здесь и на RSDN'е. Так что - в поиск!

    Здесь ты что-то путаешь. NtShutdownSystem() - это вызов ядра, никак не связанный с графической подсистемой. Так что вызывать появление какого-то окна оно никак не может. Предполагаю, что ты спутал её с InitiateSystemShutdown(). Если окно не нужно, может быть достаточно будет ExitWindowsEx() ? Если нужно именно NtShutdownSystem(), то вот то, что тебе поможет:

    Код (Text):
    1. typedef enum _SHUTDOWN_ACTION
    2. {
    3.     ShutdownNoReboot,
    4.     ShutdownReboot,
    5.     ShutdownPowerOff
    6. }
    7. SHUTDOWN_ACTION, *PSHUTDOWN_ACTION;
    8.  
    9. NTSYSAPI
    10. NTSTATUS
    11. NTAPI
    12. NtShutdownSystem(
    13.   IN SHUTDOWN_ACTION      Action );
     
  5. a1ss

    a1ss New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2007
    Сообщения:
    120
    Если напишешь прогу - выложи)
     
  6. seiko

    seiko New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    98
    Вот прототип программы, пока только по зависаниям, пишу на дельфе, думаю Win Api везде одинаковая, вопрос такой это будет работать?

    Код (Text):
    1. program Hungery;
    2.  
    3. uses
    4.   Windows,
    5.   blocking; ///мой модуль, рабочий
    6.  
    7. Var h:hwnd; id:cardinal;
    8.  
    9. function IsHungAppWindow(hwnd:hwnd):BOOL;
    10. stdcall; external 'user32.dll';
    11.  
    12. function MesFunc(p:pointer):dword;
    13. Var k:hwnd; s:string;
    14. begin
    15. result:=0;
    16. k:=hwnd(p^);
    17. s:=FindProcessNamebyWindowID(k);
    18. ///функции с Find из модуля blocking, хорошо укорачивают код
    19. If MessageBox(0,PChar('Приложение '+s+' зависло. Завершить его работу?'),
    20.  'Зависшее приложение',MB_OKCANCEL) = MB_OK then
    21. terminateprocess(FindProcessHandlebyWindowID(k),0);
    22. end;
    23.  
    24. function EnumWindowsProc(hwnd:hwnd; lparam:LPARAM):BOOL;
    25. begin
    26. If IsHungAppWindow(hwnd) then
    27.  begin
    28.   h:=hwnd;
    29.   beginthread(nil,1024,@MesFunc,@h,0,id);
    30.  end;
    31. result:=true;
    32. end;
    33.  
    34. begin
    35. repeat
    36.  EnumWindows(@EnumWindowsProc,0);
    37.  Delay(500);
    38. until false;
    39. end.
    Для тех кому лень разбираться в коде пересказываю алгоритм:
    С помощью EnumWindows перебираются все окна, в EnumWindowProc с помощью функции IsHungAppWindow выесняется зависло приложение или нет, если да,
    создается поток с диалоговым окном, которое и сообщает о зависании и предлагает завершить работу программы (в этот поток передается id окна, по которому вычисляется имя исполняемого файла приложения для информирования пользователя и хэндл приложения для его возможного завершения)
    Кстати, можно ли как-нибудь отфильтровать окна, чтобы не все из них проверять на зависание, ведь куча системных окон редко виснет?
     
  7. seiko

    seiko New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    98
    По-моему моя прога не пашет, поскольку когда открываю сетевое окружение и шелл виснет где-то секунд 20, а реакции никакой

    Появился вопрос: а как можно определить какой из процессов в данный момент времени сколько ЦП жрет (как это делается в диспетчере задач)?
    аналогично и про оперативу?

    P.S. Насчет фильтрации окон - я убрал из проверки на зависон окна с именами M и Default IME, а также без имен