Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.31;
Скачать: CL | DM;

Вниз

Постоянная проверка изменение даты .   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.017 c
14-100398
Timber Wolf
2003-03-13 17:44
2003.03.31
А может у кого есть?


1-100318
SaperXL
2003-03-20 01:00
2003.03.31
rich text <-> html


3-100146
Roman Go
2003-03-12 12:34
2003.03.31
Где скачать Servis Pack for ADO


14-100420
vladnt
2003-03-14 09:29
2003.03.31
Знак @ в эл.почте


14-100377
REA
2003-03-13 13:06
2003.03.31
Реклама