Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.08.2008, 06:41   #1
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию Способы мониторинга зависших и грузных приложений

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

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

Вопрос 3 (немного не по теме):
Какой параметер нужно передать в NtShutdownSystem из ntdll чтобы перезагрузить компьютер, а то у меня при передачи единицы и предварительного получения нужных привилегий высвечивается окно выбора (Жд. режим, Выключение или Перезагрузка)?
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился
joker вне форума Ответить с цитированием
Старый 22.08.2008, 08:30   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
с целью предложения их завершения
Ох кляузное это дело...
Много раз сталкивался со случаями когда приложение зависшее по всем параметрам, но я знаю и даже вижу что работает (например 3DStudio при рендере генерит файл), и висеть так может и час и два, а ты его закрыть хош...

Как по мне однозначно определить зависание всетки невозможно... Разве что нехарактерная работа программы, но как узнать для какой программы сколько timeout нужно?

Насчет загрузки проца вот описано: http://delphiworld.narod.ru/base/loading_processor.html
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.08.2008, 15:50   #3
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию

Вот прототип программы, пока только по зависаниям, пишу на дельфе, думаю Win Api везде одинаковая, вопрос такой это будет работать?

Код:
program Hungery;

uses
  Windows,
  blocking; ///мой модуль, рабочий

Var h:hwnd; id:cardinal;

function IsHungAppWindow(hwnd:hwnd):BOOL;
stdcall; external 'user32.dll';

function MesFunc(p:pointer):dword;
Var k:hwnd; s:string;
begin
result:=0;
k:=hwnd(p^);
s:=FindProcessNamebyWindowID(k); 
///функции с Find из модуля blocking, хорошо укорачивают код
If MessageBox(0,PChar('Приложение '+s+' зависло. Завершить его работу?'),
 'Зависшее приложение',MB_OKCANCEL) = MB_OK then
terminateprocess(FindProcessHandlebyWindowID(k),0);
end;

function EnumWindowsProc(hwnd:hwnd; lparam:LPARAM):BOOL;
begin
If IsHungAppWindow(hwnd) then
 begin
  h:=hwnd;
  beginthread(nil,1024,@MesFunc,@h,0,id);
 end;
result:=true;
end;

begin
repeat
 EnumWindows(@EnumWindowsProc,0);
 Delay(500);
until false;
end.
Для тех кому лень разбираться в коде пересказываю алгоритм:
С помощью EnumWindows перебираются все окна, в EnumWindowProc с помощью функции IsHungAppWindow выесняется зависло приложение или нет, если да,
создается поток с диалоговым окном, которое и сообщает о зависании и предлагает завершить работу программы (в этот поток передается id окна, по которому вычисляется имя исполняемого файла приложения для информирования пользователя и хэндл приложения для его возможного завершения)
Кстати, можно ли как-нибудь отфильтровать окна, чтобы не все из них проверять на зависание, ведь куча системных окон редко виснет?

P.S. 2 Stilet спасибо за ссылку
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился
joker вне форума Ответить с цитированием
Старый 23.08.2008, 15:02   #4
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию

По-моему моя прога не пашет, поскольку когда открываю сетевое окружение и шелл виснет где-то секунд 20, а реакции никакой

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

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

Последний раз редактировалось joker; 23.08.2008 в 15:08.
joker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа для удаленного мониторинга оборудования ALeonP Работа с сетью в Delphi 1 09.12.2007 15:26
способы работы с Б.Д. Ванька БД в Delphi 1 20.11.2007 22:12
способы создания баз Ванька БД в Delphi 2 20.11.2007 12:42
программа мониторинга обращения к дисковой подсистеме Vasya Софт 1 24.10.2007 21:20
Способы вызовов функций MultIfleX Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 16.10.2007 06:07