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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2014, 09:26   #1
Ahton
 
Регистрация: 03.06.2008
Сообщений: 6
По умолчанию Выполнение действия в определенное время (утечки памяти)

Здравствуйте! помогите решить проблему пожалуйста. Вот код для примера:

Код:
var
current_time: TDateTime;
change_time: string;
begin
current_time := time();
change_time := ('11:00:00');
if timetostr(current_time) = change_time then
showmessage('test');
end;
Вставляю код в таймер, ставлю интервал у таймера - минуту (60000), переменную change_time выставляю на 5 минут больше текущего времени, запускаю прогу, открываю диспетчер задач, смотрю на потребление памяти. При старте у меня 2944КБ потребление, через минуту 2952КБ и т.д. по возрастающей (+8 КБ). За сутки работы этого кода, размер потребления памяти по диспетчера задач увеличился с 3 до 9 МБ

Ставлю Timer1.Enabled := false; - потребление памяти не увеличивается ни на байт.

проблема в функции timetostr - она не высвобождает память.

Есть какой то вариант запуска определенного действия если наступило определенное время?
Условие: программа должны быть постоянно запущена, стандартный виндовый планировщик не нужен, важно именно запуск из программы в нужное время определенного действия.
Ahton вне форума Ответить с цитированием
Старый 17.04.2014, 09:52   #2
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Зачем хранить change_time в string и зачем дополнительная переменная для текущего времени?
Код:
if CompareTime(change_time,time)=-1 then
showmessage('test');
А, для задания времени срабатывания, если Вы его задаёте программно, достаточно при запуске таймера сделать следующее:
Код:
change_time := strtotime('11:00:00');
Timer1.Enabled:=true;
И будет Вам счастье.

Последний раз редактировалось Streletz; 17.04.2014 в 10:48.
Streletz вне форума Ответить с цитированием
Старый 17.04.2014, 10:11   #3
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от Streletz Посмотреть сообщение
Код:
if time() = change_time then
showmessage('test');
А, для задания времени срабатывания, если Вы его задаёте программно, достаточно при запуске таймера сделать следующее:
Код:
change_time := strtotime('11:00:00');
Timer1.Enabled:=true;
И будет Вам счастье.
Не будет ему счастья. Условие time() = change_time практически никогда не выполнится.
northener вне форума Ответить с цитированием
Старый 17.04.2014, 12:34   #4
XE5
Заблокирован
 
Регистрация: 02.03.2014
Сообщений: 439
По умолчанию

Код:
var
  Form1: TForm1;
  change_time: string = '12:30';
implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if FormatDateTime('hh:mm', Time) = change_time then
  begin
    Timer1.Enabled := false;
    showmessage('test');
  end;
end;
Проверил, память не кушает. Изложенный выше код работать не будет, так как по истечении каждых 60 секунд не факт, что на системных часах будет 00 секунд. В предложенном мной коде таймер можно выставить на одну секунду, либо 60 секунд без переключения Enabled
XE5 вне форума Ответить с цитированием
Старый 17.04.2014, 12:47   #5
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Цитата:
не факт, что на системных часах будет 00 секунд
Это с учётом каких долей секунды? Работу кода с CompareTime я проверял. Работает нормально.
А, что касается вариантов реализации с приведением типа при каждой обработке OnTime или однократном, то пусть ТС сам выбирает то, что подходит лично ему.
Streletz вне форума Ответить с цитированием
Старый 17.04.2014, 21:41   #6
XE5
Заблокирован
 
Регистрация: 02.03.2014
Сообщений: 439
По умолчанию

Streletz При чём тут доли? Обработчик OnTime будет работать раз в 60 секунд. Если таймер запущен в 12.00.05, то он будет срабатывать каждую минуту плюс пять секунд, и условие совпадения времени ни когда не выполнится (13.00.05 <> 13.00.00).
XE5 вне форума Ответить с цитированием
Старый 17.04.2014, 22:41   #7
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Цитата:
Обработчик OnTime будет работать раз в 60 секунд. Если таймер запущен в 12.00.05, то он будет срабатывать каждую минуту плюс пять секунд,
Всё с одной стороны правильно. Только, когда речь идёт о такой точности , то имеет ли смысл делать интервал срабатывания события таким большим?
Если таймер запущен в 12:00:05, то погрешность будет всего 5 секунд. А, если он запущен в 12:00:52? Как это ни странно, но FormatDateTime отбрасывает секунды, по сути, округляя значение в меньшую сторону. Поэтому, в данном случае, погрешность срабатывания события составит почти минуту. Что, во многих ситуациях, не совсем хорошо.
Конечно, многое здесь зависит от того, какая точность срабатывания нужна. Если достаточно точности +/- 1 минута, то Ваш вариант безусловно лучше. Но, если событие должно отработать ровно в 13:00:00, то тогда имеет смысл уменьшить интервал и перейти к условию совпадения времени. Всё имеет как достоинства, так и недостатки. Поэтому, одно лучше работает при одних условиях, а другое лучше работает при других. Поэтому, спорить о том какой именно вариант лучше, по меньшей мере бессмысленно.
Ещё, раз повторюсь, что конкретный выбор зависит от специфики задачи. Знает её только ТС. Ему и выбирать из предложенных вариантов наиболее подходящий.
Streletz вне форума Ответить с цитированием
Старый 17.04.2014, 22:52   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Не понимаю стремления к точному сравнению времени. Почему бы не запомнить время срабатывания в формате TDateTime и в таймере сравнивать текущее время с ним на больше или равно. Сработает для любых интервалов таймера. По поводу утечек памяти для TimeToStr сильно сомневаюсь, очень сильно. Хотя все может быть, нужно протестировать код от ТС
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.04.2014, 22:56   #9
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Цитата:
Не понимаю стремления к точному сравнению времени.
Дело вовсе не в стремлении, а в специфике задачи. В зависимости от неё разные требования к точности.
Но обсуждение требований к точности уже отдельная тема.
Streletz вне форума Ответить с цитированием
Старый 17.04.2014, 23:00   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

При чем здесь специфика? При любом способе сравнения точно никогда не сработает. А специфика задачи - просто чего-то сделать в заданное время. Точность управляется только интервалом таймера
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выполнение процедуры через определенное время 2909 Общие вопросы Delphi 1 17.05.2013 20:52
Утечки памяти YourLastSong Общие вопросы C/C++ 26 02.11.2011 22:56
утечки памяти KOLANICH Общие вопросы C/C++ 3 30.01.2011 00:15
Как приостановить выполнение макроса на определенное время? Ranel Microsoft Office Excel 6 16.06.2009 09:27
Выполнение действия в заданное время WOWan234 Помощь студентам 6 02.05.2007 01:52