Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 114

/ вопрос открыт /

Здравствуйте!

Как мне лучше сделать отслеживание того, что приложение работает нормально и если это не так перезапустить его?

Может сделать как у nnCron - 2 сервиса: основной и второй запускает его, если тот "вылетел"?

Тогда как лучше реализовать проверку на зависание основного приложения? Подумал, что будет удобно через передачу параметра и ожидания кода возврата.

Как мне реализовать свои коды возврата?

Фамилия Имя Отчество Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Фамилия Имя Отчество (статус: Посетитель)
Вопрос отправлен: 24 августа 2009, 14:20
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

Цитата:

Как мне реализовать свои коды возврата?


Очень просто - через посылку сообщений функцией PostMessage().
В обоих приложениях прописываешь константу, например
const
  CheckerMessage = WM_USER + $100; // Проверочное сообщение
  CheckerRespond = CheckerMessage + 1; // Ответное сообщение

В проверяющей проге пишешь функцию проверки работоспособности проверяемой проги, примерно так:
procedure  TMainForm.CheckProgramRespond;
begin
  Flag:= False; // <--- флаг работоспособности приложения
  PostMessage(<Хэндл окна проверяемой проги>, CheckerMessage, 0, 0);
  // <--- Здесь запускаешь кокой-нить таймер с интервалом, равным времени,
  // через которое проверяемая прога считается зависшей.
  Timer.Enabled:= True;
end;
 
// функция отлова сообщений
procedure TMainForm.AppEventsMessage(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if Msg.Message = CheckerRespond // <--- ответ от проверяемой проги
    then Flag:= True;
end;
 
procedure TMainForm.TimerTimer(Sender: TObject);
begin
  if not Flag
    then ShowMessage('Прога висит!');
 
  Timer.Enabled:= False;
end;

Затем, в проверяемой проге пишешь реакцию на это сообщение, например, в Application.OnMessage() или в message-методе главной формы:
procedure TMainForm.AppEventsMessage(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if Msg.Message = CheckerMessage 
    then PostMessage(<хэндл окна ПРОВЕРЯЮЩЕЙ проги>, CheckerRespond, 0, 0);
end;

Ну вот, типа того.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 24 августа 2009, 14:59
Оценка за ответ: 5

Комментарий к оценке: А как мне всё-таки сделать код возврата через командную строку?

Мини-форум вопроса

Всего сообщений: 6; последнее сообщение — 27 августа 2009, 18:35; участников в обсуждении: 3.
min@y™

min@y™ (статус: Доктор наук), 24 августа 2009, 15:05 [#1]:

Хэндл окна проверяющей проги, кстати, можно передавать в самой посылке сообщения
PostMessage(<Хэндл окна проверяемой проги>, CheckerMessage, 0, Integer(Application.Handle));
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Фамилия Имя Отчество

Фамилия Имя Отчество (статус: Посетитель), 26 августа 2009, 17:01 [#2]:

А как мне всё-таки сделать код возврата через командную строку?
min@y™

min@y™ (статус: Доктор наук), 26 августа 2009, 17:40 [#3]:

Цитата (Фамилия Имя Отчество):


А как мне всё-таки сделать код возврата через командную строку?


А как ты себе это представляешь? Опиши подробнее.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 26 августа 2009, 19:07 [#4]:

нужно, что бы приложение возвратило код ошибки какой то, если проверяемая программа не отвечает и этот код ошибки будет обработан кроном/батником?
это очень просто. Либо выходим с приложения по halt(код_ошибки_числом), но это "неэтично" - приложение сразу завершается. Либо, что более этично - выствляем переменную ExitCode в нужное значение. (это глобальная системная переменная). По историческим соображениям она больше 255 (или всё таки 127, не помню точно) быть не может.
Галочка "подтверждения прочтения" - вселенское зло.
Фамилия Имя Отчество

Фамилия Имя Отчество (статус: Посетитель), 27 августа 2009, 17:04 [#5]:

> А как ты себе это представляешь? Опиши подробнее.

проверяющая постоянно шлёт команду проверки, а та отвечает, если не ответила - значит зависла
min@y™

min@y™ (статус: Доктор наук), 27 августа 2009, 18:35 [#6]:

Цитата:

проверяющая постоянно шлёт команду проверки, а та отвечает, если не ответила - значит зависла


А чо, мой вариант не подходит? Почему?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 5 июня 2023, 09:55
Выполнено за 0.03 сек.
Рейтинг@Mail.ru