Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Закрыть программу при выполнении Delay


Автор: razumsap 2.7.2010, 13:13
Собственно вопрос.
Как закрыть программу, если стоит задержка Delay-ем 10 минут, форма не риагирует на закрытие.
Только через диспетчер задачь могу грохнуть, хотелось бы корректно.

Автор: Alexeis 2.7.2010, 13:41
Код

i := 500 * 60;
while (not Terminated) or (i <> 0)
do
   begin
     dec(i);
     Sleep(20);
   end;


Сбрасываешь флаг Terminated в true и ожидание прекращается.

Автор: Keeper89 2.7.2010, 13:47
Только or вместо ||.

Автор: Alexeis 2.7.2010, 13:49
Keeper89, эта болезнь называется С++  smile 

Еще такой момент. Если флаг устанавливать в OnClose, то в цикл нужно чуток переделать
Код

i := 500 * 60;
while (not Terminated) or (i <> 0)
do
   begin
     dec(i);
     Sleep(20);
     Application.ProcessMessages();
   end;

Автор: Frees 2.7.2010, 14:03
флаг уже есть: Application.Terminated

Автор: Alexeis 2.7.2010, 14:12
Цитата(Frees @  2.7.2010,  13:03 Найти цитируемый пост)
флаг уже есть: Application.Terminated

VCL  smile 

Здорово, значит обработчик OnClose даже не нужен, только Application.ProcessMessages(); для обработки сообщения о завершении.

Автор: CodeMonkey 2.7.2010, 14:21
Только по обнаружению признака Terminated лучше бы делать Abort.

Потому что вызывающий может быть устроен так:

Код
Delay(10000);
// и пошли дальше работать!


Что с того, что Delay выйдет раньше времени, если вызывающий просто продолжает работу без попыток анализа флага?

Автор: Keeper89 2.7.2010, 14:22
Цитата(Alexeis @  2.7.2010,  13:49 Найти цитируемый пост)
эта болезнь называется С++  smile 

smile и у меня бывает.

З.Ы. Судя по всему ТС наставил минусов и убежал )

Автор: Alexeis 2.7.2010, 14:38
Цитата(CodeMonkey @  2.7.2010,  13:21 Найти цитируемый пост)
Только по обнаружению признака Terminated лучше бы делать Abort.

  Но ведь тогда не будет возможности произвести завершающие операции в программе. Или ты имеешь ввиду, что код должен быть помещен в try finally end, а все завершающие операции помещены в finally ?

Автор: CodeMonkey 2.7.2010, 15:09
Цитата(Alexeis @  2.7.2010,  15:38 Найти цитируемый пост)
Или ты имеешь ввиду, что код должен быть помещен в try finally end, а все завершающие операции помещены в finally ? 

Должен. Ведь от AV никто не застрахован.

А даже если нет - мы ведь всё равно выходим из программы. Автор, вон, вообще Terminate процессу делал до этого. 

Автор: razumsap 2.7.2010, 15:09
Понравилось такая штука 

Halt(4);
жаль что несовсем то что я хотел

Автор: Alexeis 2.7.2010, 15:30
Цитата(CodeMonkey @  2.7.2010,  14:09 Найти цитируемый пост)
Должен. Ведь от AV никто не застрахован.

  На самом деле, если возникло неожиданное AV, то программу можно смело закрывать. Дальнейшее поведение непредсказуемо. Поэтому не согласен на счет AV. Другое дело, что многие классы VCL генерят программные исключения, как стандартный механизм уведомления об ошибке.

Цитата(CodeMonkey @  2.7.2010,  14:09 Найти цитируемый пост)
Автор, вон, вообще Terminate процессу делал до этого.  
 И тем не менее вопрос состоит в том,
Цитата(razumsap @  2.7.2010,  12:13 Найти цитируемый пост)
Только через диспетчер задачь могу грохнуть, хотелось бы корректно. 


Многие ведь не используют try finally (или используют исключительно редко), так что твой Abort() произвел бы аварийное завершение без сохранения данных пользователя smile . 

 smile как оказалось плюсовые try catch по стандарту не обрабатывают аппаратные исключения. Вероятно, по тем же соображениям, что после такой ситуации правильнее всего завершить приложение сразу, пока оно не испортило данные пользователя. 

Автор: CodeMonkey 2.7.2010, 19:51
Цитата(Alexeis @  2.7.2010,  16:30 Найти цитируемый пост)
Вероятно, по тем же соображениям, что после такой ситуации правильнее всего завершить приложение сразу, пока оно не испортило данные пользователя. 

AV <> EDivByZero. C++ fail.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)