![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не отвечает [D7, 95/98, ME, NT4, 2000, XP]
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]А кто должен реагировать то? Неотвечающее приложение?