Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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]

Надо ошибки в приложении исправить и вопрос отпадёт&#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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.058 c
2-1190362266
АндрейК
2007-09-21 12:11
2007.10.21
Delphi7 и FastReport 3.19


11-1174071703
AnalogXP
2007-03-16 22:01
2007.10.21
Нужна маленькая программа


4-1177066904
..::KraN::..
2007-04-20 15:01
2007.10.21
Открыть с помощью...


2-1190789736
l_v
2007-09-26 10:55
2007.10.21
ServerSocket


9-1161684252
Ekzot
2006-10-24 14:04
2007.10.21
Поворот четырёхугольника.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский