Форум: "Начинающим";
Текущий архив: 2007.10.21;
Скачать: [xml.tar.bz2];
ВнизНе отвечает Найти похожие ветки
← →
hinst (2007-09-28 16:41) [0]Как сделать свою реакцию на <<Приложение не отвечает>>. Спасибо.
← →
DVM © (2007-09-28 16:42) [1]А кто должен реагировать то? Неотвечающее приложение?
← →
Kolan © (2007-09-28 16:45) [2]Надо ошибки в приложении исправить и вопрос отпадёт…
← →
hinst (2007-09-28 16:46) [3]Мне кажется, можно сделать, чтобы основное приложение запускалось из контролирующего потока, который и проверял ответы на сообщения. Да?
← →
hinst (2007-09-28 16:48) [4]
> Надо ошибки в приложении исправить и вопрос отпадёт…
Просто на старых компах некоторые прочессы в программе могут вдруг занять много времени, а какие - заранее сказать трудно. Поэтому легче сделать один следящий прочесс, чем на все процедуры ставить "Please, ждите"
← →
DVM © (2007-09-28 16:49) [5]
> Да?
Сделать отдельный процесс, который будет мониторить другой.
← →
hinst (2007-09-28 16:50) [6]
> А кто должен реагировать то? Неотвечающее приложение?
Кто угодно, но чтоб писал "Приложение занято, ждите. Надоест ждать - <3авершить> жмите."
← →
DVM © (2007-09-28 16:50) [7]
> Кто угодно
Кто угодно не выйдет ибо процесс не может мониторить сам себя на предмет зависания.
← →
hinst (2007-09-28 16:51) [8]
> Сделать отдельный процесс, который будет мониторить другой.
Об этом и вопрос - [как?]
Насчёт отдельного процесса понятно, а как мониторить?
← →
DVM © (2007-09-28 16:52) [9]
> а как мониторить?
Сначала давай разберемся, что значит в твоем случае зависшее приложение?
← →
Kolan © (2007-09-28 16:53) [10]> Просто на старых компах некоторые прочессы в программе могут
> вдруг
может поместить эти проЧесы в отдельный поток?
← →
hinst (2007-09-28 16:53) [11]
> Сначала давай разберемся, что значит в твоем случае зависшее
> приложение?
Давай. В течении 10 секунд оно не отвечает на системные сообщения и не перерисовывает себя, в ХР в таком случае в заголовок окна добавляется (Не отвечает)
← →
DVM © (2007-09-28 16:54) [12]
> а как мониторить?
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;
← →
Kolan © (2007-09-28 16:54) [13]> В течении 10 секунд оно не отвечает на системные сообщения
> и не перерисовывает себя, в ХР в таком случае в заголовок
> окна добавляется (Не отвечает)
Так и думал. См. [10].
← →
hinst (2007-09-28 16:55) [14]
> может поместить эти проЧесы в отдельный поток?
Идея хорошая, но я не знаю заранее, какие конкретно функции будут тормозить.
← →
Kolan © (2007-09-28 16:57) [15]> Идея хорошая, но я не знаю заранее, какие конкретно функции
> будут тормозить.
Нет, ты это прекрасно знаешь, я в этом уверен… Помести все функции, которые могут тормазить в отд. потоки если потребуется.
Вариант с 2 процессом — это в данном случае изврат…
← →
Сергей М. © (2007-09-28 16:58) [16]
> я не знаю заранее, какие конкретно функции будут тормозить
А вот это оч плохо.
← →
umbra © (2007-09-28 17:17) [17]тормозить могут или длительные расчеты или блокирующий ввод-вывод. Больше, вроде бы, и тормозить нечему.
← →
DVM © (2007-09-28 17:25) [18]
> Больше, вроде бы, и тормозить нечему.
Зато есть кому.
← →
hinst (2007-09-28 17:40) [19]Responding - это чё?
← →
Сергей М. © (2007-09-28 17:44) [20]
> Responding - это чё?
Это "отвечание")
← →
hinst (2007-09-28 17:46) [21]Пасибо всем. Теперь зделаю.
← →
Anatoly Podgoretsky © (2007-09-28 19:18) [22]> hinst (28.09.2007 16:53:11) [11]
это не считается зависшим даже в ХР, вот 20 секунд другое дело, но это не означает зависшие приложение, может надо еще минут 300 подождать, может там супер запрос выполняется
← →
Kolan © (2007-09-28 20:14) [23]> Пасибо всем. Теперь зделаю.
Молодец DVM, научил млин :(
← →
homm © (2007-09-28 21:35) [24]Давай разберемся, что происходит в случае твоего «зависания».
Есть основной поток приложения, в его окна виндовс направляет сообщения от пользователя и от системы (ввод и перерисовка). Если вдруг по каким-то причинам поток долгое время не выбирает сообщения из очереди, виндовс показывает это приложение как не отвечающее (заметь, не «зависшее»). Есть минимум 2 способа борьбы с такой ситуацией.
1) Выносить все свои вычисления, в процессе которых приложение загружает процессор, в другой поток. Тогда основной поток просто запускает дополнительный с расчетами и продолжает получать сообщения от системы.
2) Т.к. поток сам сообщения обрабатывать не будет, можно его это заставить. Для этого, например, если у тебя идет цикл с большими вычислениями, в нем ставится обработчик сообщенийApplication.ProcessMessages();
, прада вставка обработчика сообщений на каждом шагк твоих вычислений может затянуть сами вычисления еще больше, для этого ставят обработчик реже, чем каждый шаг, например так:
for i := 0 to 9999999 do begin
//Твои мега вычисления
step := step +1;
if step = 999 then begin
step := 0;
Application.ProcessMessages();
end;
end;
← →
Kolan © (2007-09-29 09:36) [25]> Давай разберемся, что происходит в случае твоего «зависания».
Поздно… чел уже получил ответ :( только ему нужен был другой…
← →
DVM © (2007-09-29 15:15) [26]
> Поздно… чел уже получил ответ :( только ему нужен был другой…
Это ответ именно на его вопрос. То что он задал вопрос неверно - это его проблема, вытягивать из него информацию о его действительной проблеме пустая трата времени.
← →
Kolan © (2007-09-29 17:42) [27]
> Это ответ именно на его вопрос. То что он задал вопрос неверно
> - это его проблема
Не верю что ты не понял о чем он..
К тому же "начинающие" - не всегда задают верные вопросы, имхо если видишь, что вопрос не тот надо постараться вывести "на чистую воду"..
← →
DVM © (2007-09-29 21:21) [28]
> Не верю что ты не понял о чем он..
Вначале нет, после [4] поста да, но решил ответить прямо на первоначальный вопрос.
← →
Kolan © (2007-09-29 21:51) [29]но решил ответить прямо на первоначальный вопрос, показать ято я крут, а то что человека можно было направить в нужном напрвлении — это фигня.
:(
← →
DVM © (2007-09-29 22:16) [30]
> показать ято я крут
я из детсадовского возраста вышел давно.
> а то что человека можно было направить в нужном напрвлении
> — это фигня
Неудачи они, понимаешь, штука крайне нужная и полезная. Человек и сам рано или поздно поймет, что он не на верном пути.
← →
homm © (2007-09-29 22:41) [31]> [30] DVM © (29.09.07 22:16)
> Человек и сам рано или поздно поймет, что он не на верном
> пути.
Человек то поймет, а вот на свете станет на одну кривую программу больше. По твоей вине, между прочим :)
← →
Kolan © (2007-09-30 09:08) [32]> я из детсадовского возраста вышел давно.
Мне показалось наоборот, ладно фиг с ним…
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.10.21;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.038 c