Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не отвечает [D7, 95/98, ME, NT4, 2000, XP]


Страницы:   1 2

hinst ©   (2007-09-28 16:41:00) 

Как сделать свою реакцию на <<Приложение не отвечает>>. Спасибо.


DVM   (2007-09-28 16:54:00) [21]


> а как мониторить?


function IsAppRespondig9X(dwThreadId: DWORD): Boolean;
type
 TIsHungThread = function(dwThreadId: DWORD): BOOL; stdcall;
var
 hUser32: HMODULE;
 IsHungThread: TIsHungThread;
begin
 Result := True;
 hUser32 := GetModuleHandle('user32.dll');
 if (hUser32 > 0) then
 begin
   @IsHungThread := GetProcAddress(hUser32, 'IsHungThread');
   if Assigned(IsHungThread) then
     begin
       Result := not IsHungThread(dwThreadId);
     end;
 end;
end;

//------------------------------------------------------------------------------

function IsAppRespondigNT(wnd: HWND): Boolean;
type
 TIsHungAppWindow = function(wnd:hWnd): BOOL; stdcall;
var
 hUser32: HMODULE;
 IsHungAppWindow: TIsHungAppWindow;
begin
 Result := True;
 hUser32 := GetModuleHandle('user32.dll');
 if (hUser32 <> 0) then
 begin
   @IsHungAppWindow := GetProcAddress(hUser32, 'IsHungAppWindow');
   if Assigned(IsHungAppWindow) then
     begin
       Result := not IsHungAppWindow(wnd);
     end;
 end;
end;

//------------------------------------------------------------------------------

function IsAppRespondig(Wnd: HWND): Boolean;
var
 dwThreadId: Cardinal;
begin
if not IsWindow(Wnd) then
begin
  result := false;
  Exit;
end;
if Win32Platform = VER_PLATFORM_WIN32_NT then
  Result := IsAppRespondigNT(wnd)
else
  begin
    dwThreadId := GetWindowThreadProcessId(Wnd, nil);
    Result := IsAppRespondig9X(dwThreadId);
    CloseHandle(dwThreadId);
  end;
end;

//------------------------------------------------------------------------------

function IsAppResponding(WindowName: string): boolean;
var
 h: HWND;
begin
 result := false;
 h := FindWindow(nil, PChar(WindowName));
 if h <> 0 then
   begin
     result := IsAppRespondig(h);
   end;
end;


hinst   (2007-09-28 16:53:00) [22]


> Сначала давай разберемся, что значит в твоем случае зависшее
> приложение?

Давай. В течении 10 секунд оно не отвечает на системные сообщения и не перерисовывает себя, в ХР в таком случае в заголовок окна добавляется (Не отвечает)


Kolan   (2007-09-28 16:53:00) [23]

> Просто на старых компах некоторые прочессы в программе могут
> вдруг

может поместить эти проЧесы в отдельный поток?


DVM   (2007-09-28 16:52:00) [24]


> а как мониторить?

Сначала давай разберемся, что значит в твоем случае зависшее приложение?


hinst   (2007-09-28 16:51:00) [25]


> Сделать отдельный процесс, который будет мониторить другой.

Об этом и вопрос - [как?]
Насчёт отдельного процесса понятно, а как мониторить?


DVM   (2007-09-28 16:50:00) [26]


> Кто угодно

Кто угодно не выйдет ибо процесс не может мониторить сам себя на предмет зависания.


hinst   (2007-09-28 16:50:00) [27]


> А кто должен реагировать то? Неотвечающее приложение?

Кто угодно, но чтоб писал "Приложение занято, ждите. Надоест ждать - <3авершить> жмите."


DVM   (2007-09-28 16:49:00) [28]


> Да?

Сделать отдельный процесс, который будет мониторить другой.


hinst   (2007-09-28 16:48:00) [29]


> Надо ошибки в приложении исправить и вопрос отпадёт…

Просто на старых компах некоторые прочессы в программе могут вдруг занять много времени, а какие - заранее сказать трудно. Поэтому легче сделать один следящий прочесс, чем на все процедуры ставить "Please, ждите"


hinst   (2007-09-28 16:46:00) [30]

Мне кажется, можно сделать, чтобы основное приложение запускалось из контролирующего потока, который и проверял ответы на сообщения. Да?


Kolan   (2007-09-28 16:45:00) [31]

Надо ошибки в приложении исправить и вопрос отпадёт…


DVM   (2007-09-28 16:42:00) [32]

А кто должен реагировать то? Неотвечающее приложение?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо