Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.21;
Скачать: CL | DM;

Вниз

Не отвечает   Найти похожие ветки 

 
hinst   (2007-09-28 16:41) [0]

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


 
DVM ©   (2007-09-28 16:42) [1]

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


 
Kolan ©   (2007-09-28 16:45) [2]

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


 
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]

> Идея хорошая, но я не знаю заранее, какие конкретно функции
> будут тормозить.

Нет, ты это прекрасно знаешь, я в этом уверен&#133 Помести все функции, которые могут тормазить в отд. потоки если потребуется.

Вариант с 2 процессом &#151; это в данном случае изврат&#133


 
Сергей М. ©   (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]

> Давай разберемся, что происходит в случае твоего «зависания».

Поздно&#133 чел уже получил ответ :( только ему нужен был другой&#133


 
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]

но решил ответить прямо на первоначальный вопрос, показать ято я крут, а то что человека можно было направить в нужном напрвлении &#151; это фигня.
:(


 
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]

> я из детсадовского возраста вышел давно.

Мне показалось наоборот, ладно фиг с ним&#133



Страницы: 1 вся ветка

Текущий архив: 2007.10.21;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.016 c
2-1190891450
Yogan
2007-09-27 15:10
2007.10.21
Многопоточность


15-1190355579
zdm77
2007-09-21 10:19
2007.10.21
ICQ игнор


10-1138264598
sam98
2006-01-26 11:36
2007.10.21
OPC клиент (передача серверу нескольких значений переменных)


15-1190464568
me
2007-09-22 16:36
2007.10.21
Сайты, форумы для изучающих английский


15-1190286598
ANTPro
2007-09-20 15:09
2007.10.21
Подкажите программу