Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.02.2012, 14:01   #1
MaxOz
 
Регистрация: 09.02.2012
Сообщений: 8
Восклицание Завершение программы при выключении ПК (во время sleep-а)

Добрый день. Знаю, что подобных тем много, но все, что пересмотрел -перепробовал - не помогает.
Итак, ситуация:
имеется прога, работает в фоновом режиме (формы от пользователя скрыты), раз в 5 минут выполняет вычисления, записывает в файл, потом sleep(300000), потом снова вычисления, потом опять sleep и так все в цикле. Все работает нормально, но при выключении компа появляется окно завершения программы, потом программа не отвечает и предложение принудительно завершить, это не есть хорошо.

Пробовал ловить WM_QUERYENDSESSION:

private
{ Private declarations }
Procedure WMQueryEndSession(Var Message: TMessage);
Message WM_QUERYENDSESSION;


Procedure TForm1.WMQueryEndSession(Var Message: TMessage);
begin
inherited;
Application.Terminate; // пробовал и Form1.Close;
Message.Result:=1;
End;

не помогает

Может sleep чем-то заменить или какие другие варианты есть? Может я не правильно отлавливаю WM_QUERYENDSESSION?

сам sleep и все вычисления в другой процедуре, может их как-то завязать нужно?
MaxOz вне форума Ответить с цитированием
Старый 13.02.2012, 14:54   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

При выполнении sleep сообщения не обрабатываются. Попробуйте с помощью таймера это сделать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.02.2012, 15:26   #3
MaxOz
 
Регистрация: 09.02.2012
Сообщений: 8
По умолчанию

Аватар
Спасибо за предложение, но придумал другой вариант:
поставил sleep в цикл, уменьшил задержку и после sleepа вставил Application.ProcessMessages()
теперь срабатывает нормально
MaxOz вне форума Ответить с цитированием
Старый 13.02.2012, 16:31   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Не правильно делаете!
Код:
Procedure TForm1.WMQueryEndSession(Var Message: TMessage);
 begin
 inherited;
 Application.Terminate; // пробовал и Form1.Close;
 Message.Result:=1;
 End;
inherited; Должо быть вызвано после вашего кода.
Иначе ваша програма закроется не закончив собственную финализацию(Сохранение данных, уничтожение обьектов, подготовка к завершению).
Код:
Procedure TForm1.WMQueryEndSession(Var Message: TMessage);
 begin
 //Сдесь финализируете данные, но не уничтожаете программу
 Message.Result:=1;
  inherited;
 End;
После QUERTYENDSESSION ваша программа получит WM_ENDSESSION и тогда экземпляр вашей программы с легкостью закроется т.к. вы уже были подготовлены к закрытию при помощи QUERTYENDSESSION
Человек_Борща вне форума Ответить с цитированием
Старый 13.02.2012, 16:34   #5
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

И всё таки в Вашем случае правильнее удобнее будет использовать таймер.
FaTaL вне форума Ответить с цитированием
Старый 13.02.2012, 17:02   #6
MaxOz
 
Регистрация: 09.02.2012
Сообщений: 8
По умолчанию

Человек_Борща Спасибо.
inherited; - поменял положение, а финализировать-то в проге особо нечего, объекты не использую, только несколько переменных
FaTaL
Вариант с таймером еще рассмотрю
MaxOz вне форума Ответить с цитированием
Старый 13.02.2012, 17:09   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

не опязательно таймер. Просто удерживайте QUERTYENDSESSION до завершения sleep'а.

перед слипом ставье некоторую перемнную в true, потом While smth do begin end else begin nherited; end; все.
Человек_Борща вне форума Ответить с цитированием
Старый 29.02.2012, 18:01   #8
MaxOz
 
Регистрация: 09.02.2012
Сообщений: 8
Хорошо

таки поставлю точку в теме.

таймер оказался наилучшим вариантом: код проще, sleep, так или иначе, теперь не мешает никаким процессам.

Всем спасибо за участие.
MaxOz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ожидание завершения потока при выключении службы 3D Hunter Общие вопросы Delphi 15 27.08.2011 14:55
Завершение работы ОС в определенное время LSpirit Общие вопросы Delphi 4 04.08.2011 11:20
Синий экран при выключении bookkc Помощь студентам 2 19.11.2010 14:59
При выключении компьютера периферия отключаются сама. Elsanit Компьютерное железо 0 05.10.2009 09:28
При завершение работы программы появляется окно Microsoft Visual C++ Debug Library TheWanderer Visual C++ 2 25.11.2008 00:27