Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-100449
Delirium^.Tremens
2003-03-14 17:51
2003.03.31
Самовар не работает


3-100142
Fbist
2003-03-11 13:48
2003.03.31
ADO в DLL :(


9-100140
Psibug
2002-10-31 12:31
2003.03.31
Формат графики Fallout (*.FRM)


8-100347
Тень_1
2002-12-25 21:58
2003.03.31
DIB Components


14-100388
BERK
2003-03-12 20:24
2003.03.31
Есть RX (или аналогичные по классу компоненты) под CBuilder6?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский