|
Вопрос # 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™ (статус: Доктор наук), 24 августа 2009, 15:05 [#1]:
Хэндл окна проверяющей проги, кстати, можно передавать в самой посылке сообщения
PostMessage(<Хэндл окна проверяемой проги>, CheckerMessage, 0, Integer(Application.Handle));
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Фамилия Имя Отчество (статус: Посетитель), 26 августа 2009, 17:01 [#2]:
А как мне всё-таки сделать код возврата через командную строку?
|
|
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™ (статус: Доктор наук), 27 августа 2009, 18:35 [#6]:
Цитата:
проверяющая постоянно шлёт команду проверки, а та отвечает, если не ответила - значит зависла
А чо, мой вариант не подходит? Почему?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|