Событие в момент времени по часам.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Событие в момент времени по часам.

Сообщение GAMER »

Есть ли готовая возможность или легкий (в смысле для нагрузки проца и памяти) способ, чтобы поймать событие в момент времени (например 13:42:34)?
Дергать каждую секунду таймер и проверять системное время, как-то не красиво.
kosteek
постоялец
Сообщения: 203
Зарегистрирован: 24.07.2008 14:57:09
Откуда: Украина, г.Славянск

Сообщение kosteek »

Код: Выделить всё

function TimeToMillisec(t:TDateTime):integer;
begin
  result:=1000*(strtoint(FormatDateTime('ss',t))+(60*strtoint(FormatDateTime('mm',t)))+(60*60*strtoint(FormatDateTime('hh',t))));
end;


function TimerInterval(start_time:string):integer;
begin
  result:=TimeToMillisec(StrToTime(start_time))-TimeToMillisec(Time);
   if TimeToMillisec(Time) >= TimeToMillisec(StrToTime(start_time)) then result:= (60*60*60*1000)+(TimeToMillisec(StrToTime(start_time))-TimeToMillisec(Time));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Timer1.Interval:=0;
  Timer1.Enabled:=True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var start_time:string = '10:48:53';
begin
  Timer1.Interval:=TimerInterval(start_time);
  Timer1.Enabled:=True;
end;
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

Спасибо.
Я правильно понял, что:
1. Создаеться форма, интервал:=0, чтобы сразу отрабатало TForm1.Timer1Timer?
2. Там просчитывается, сколько времени осталось до события и устанавливаеться нужный интервал?
3. Через правильно расчитаный интервал происходит событие и интервал менячет свое значение на время до следующего события (грубо 24 часа)?
kosteek
постоялец
Сообщения: 203
Зарегистрирован: 24.07.2008 14:57:09
Откуда: Украина, г.Славянск

Сообщение kosteek »

Все верно.
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

60*strtoint(FormatDateTime('mm',t

Думаю, что здесь должно быть nn, а не mm.
kosteek
постоялец
Сообщения: 203
Зарегистрирован: 24.07.2008 14:57:09
Откуда: Украина, г.Славянск

Сообщение kosteek »

Верно, ошибся.
Но по ссылке ниже, автор возможно сам ошибается. Нужно проверить.
http://www.delphibasics.ru/FormatDateTime.php
Аватара пользователя
Sharfik
энтузиаст
Сообщения: 839
Зарегистрирован: 20.07.2013 01:04:30

Сообщение Sharfik »

По моему опыту нет ничего плохого в установке интервала на минуту. В делфи он больше не выставлялся. Нагрузка на проц. мизерная на самом деле.
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

2Sharfik. Если вы о sleep(), то этот вариант в даном случае мне не подходит. А вот приведенный пример в самый раз, только я его подправил немного под себя.
Аватара пользователя
Sharfik
энтузиаст
Сообщения: 839
Зарегистрирован: 20.07.2013 01:04:30

Сообщение Sharfik »

GAMER писал(а):2Sharfik. Если вы о sleep(), то этот вариант в даном случае мне не подходит. А вот приведенный пример в самый раз, только я его подправил немного под себя.

Я о таймере.
Alex2013
долгожитель
Сообщения: 3237
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Ну чуть по фантазировав Sleep или похожую функцию можно "повесть" на отдельный поток ... (Хотя это понятное дело "оверкил" хотя многое зависит от реализации задержки... )
А с таймером можно просто изредка проверь системное время и при приближении "времени-Ч" делать это чаще . (ИМХО надежнее чем ожидать вычисляемое количество интервалов - мало ли что там процессор сожрет, а часы от него независимы )
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

У меня в одном проекте (разные задачи) в одном случае лучше sleep, а в другом таймер.
Например, идет выборка с БД. Может быть случай, что обработка будет идти дольше, чем интервал таймера. И обрабатываются повторно те записи, которые обрабатываются еще в первой вызове.
Кстати, нужно будет проверить поведение таймера, если тело таймера выполняется дольше, чем интервал.
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

GAMER писал(а):Кстати, нужно будет проверить поведение таймера, если тело таймера выполняется дольше, чем интервал.

Будет ждать звершения. Тик пропустит.
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

Спасибо.
Ответить