Форум: "Основная";
Текущий архив: 2003.03.31;
Скачать: [xml.tar.bz2];
ВнизПостоянная проверка изменение даты . Найти похожие ветки
← →
TY (2003-03-19 08:16) [0]Посоветуйте какая есть альтернатива таймеру.
Т.е. нужно постоянно проверять изменение даты .(не смену системной даты, а именно изменение)
Можно сделать так,
procedure Form1.Timer1Timer(Sender: TObject);
begin
Мой код
end;
но при этом нагрузить
дополнительным таймером программу
а может есть какая либо процедура реагирующая
на постоянные сообщения Win(нужна дискретность хотябы 10сек. или менее).
← →
Sheriff (2003-03-19 08:25) [1]могу намекнуть, что изменение даты происходит раз в сутки... примерно в полночь... :)
← →
PONTIY (2003-03-19 08:30) [2]2 Sheriff, так прога и должна следить когда эта полночь настанет. Чем кроме таймера она может это сделать?
← →
Юрий Зотов (2003-03-19 08:38) [3]> Чем кроме таймера она может это сделать?
Таймером, в котором интервал установлен на число миллисекунд, оставшихся до полуночи. Без постоянных проверок и дискретности в 10 сек.
← →
Sheriff (2003-03-19 08:39) [4]ну не каждые же 10 сек. в течение суток?
прочитали при старте, поставили интервал таймера ближе к полночи с запасом, как сработал, проверили сколько осталось, скорректировали интервал и т.д.
а без таймера:
создаем отдельный поток и крутим в не цикл, в котором определяем ситемное время и выставляем bool в полночь.
какая точность-то нужна?
← →
TY (2003-03-19 08:57) [5]>Sheriff точность нужна чем меньше мил.сек тем лучше
Как проверить время начала суток проблемы нет собственно вот
код о котором я говорил
1.Переводим строку времени в секунды
function TimeIntSec(D:String):Integer;
var
S,S1:String;
begin
Result:=-1;
If D="" Then Exit;
S:=Copy(D,1,Pred(Pos(TimeSeparator,D)));
Delete(D,1,Pos(TimeSeparator,D)) ;
S1:=Copy(D,1,Pred(Pos(TimeSeparator,D)));
Delete(D,1,Pos(TimeSeparator,D)) ;
try
Result:=(StrToInt(S)*3600)+(StrToInt(S1)*60)+StrToInt(D);
except
end;
end;
а затем по таймеру проверяем
procedure Form1.Timer2Timer(Sender: TObject);
begin
If TimeIntSec(TimeToStr(Time)) in[0..1] Then Мои Действия
end;
Значит оптимизировать по советам приведенным выше можно так при запуске определяем системное время и делаем интервал таймера ближе к полуночи или есть еще варианты?
← →
Sheriff (2003-03-19 09:18) [6]еще вариант изложен
Юрий Зотов © (19.03.03 08:38)
его удобно применять на последнем этапе
← →
REA (2003-03-19 10:41) [7]Дык эта Trunc(OldTime)<>Trunc(Now). Или я чего то не понял?
Таймер выставлять на половину оставшегося срока (ну кроме 0 разумеется), дабы не промахнуться.
← →
Bel (2003-03-19 10:49) [8]А если за время между установкой таймера и окончанием интервала пользователь (или ещё кто-то) поменяет время на 23:59? Тогда таймер сработает намного позже, чем полночь.
← →
REA (2003-03-19 10:55) [9]Логично... Ну тогда параллельный процесс с низким приоритетом. А события случайно нет смены времени пользователем?
← →
Smithson (2003-03-19 11:03) [10]Есть такое системное сообщени WM_CHANGEDATE или что-то похожее... Как раз на случай смены времени-даты
← →
Bel (2003-03-19 11:43) [11]В хэлпе по WinAPI я нашёл сообщение WM_TIMECHANGE, оно, насколько я понял, посылается приложением, изменяющим системное время. Т.е. можно использовать вариант Юрий Зотов © (19.03.03 08:38) и перехватывать сообщение WM_TIMECHANGE.
← →
TY (2003-03-20 01:41) [12]Собрав все советы воедино я сделал так
//Отслеживаю изменилось ли систеная настройка
procedure TForm14.WMTIMECHANGE(var Message: TWMTIMECHANGE);
begin
//Мои Действия
CorrectInterval//моя функция смысл приведен ниже
end;
procedure TForm14.CorrectInterval;
begin
If ToNewDay<>-1 Then Timer2.Interval:= ToNewDay Else Timer2.Interval:=1000;//на всякий случай если функция сбойнула
end;
//Определяю интервал таймера до конца дня
function ToNewDay:Integer;
begin
try
Result:=86400-TimeIntSec(TimeToStr(Time))
except
Result:=-1;
end;
end;
//Если наступило 00:00:00
procedure TForm14.Timer2Timer(Sender: TObject);
begin
If TimeIntSec(TimeToStr(Time)) =0 Then //Мои Действия
end;
//И последнее на всякий случай CorrectInterval я поставил в наиболее "событийном" месте проги для переодической корректировки
сдесь же ппроисходит и срабатывание CorrectInterval при запуске проги.
Всем спасибо за советы.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.03.31;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c