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

Вниз

Напоминалка   Найти похожие ветки 

 
Std ©   (2006-05-30 16:01) [0]

Доброго времени.
Пишу я для себя совсем маленькую прогу, которая бы напоминала мне о моих запланированых делах.
вношу я данные, дату и время когда нопомнить, и текст который будет высвечиваца при напоминании. так вот впорос:
как мне лучше реализовать проверку наступило ли время напоминания или нет.
я думал запускать таймер и смотреть каждую секунду наступило ли время события, но че то мне кажется что акой метод немного не правильный, так как если запись 1 или 3 то оно нормально будет проверять, а если записей несколько десятков...
подскажите как лучше реализовать проверку


 
stone ©   (2006-05-30 16:32) [1]


> я думал запускать таймер и смотреть каждую секунду наступило
> ли время события

Необходима ли такая точность? Может достаточно раз минуту? или еще реже.

>  если записей несколько десятков...

Исключать записи, время которых прошло (тут имеет смысл использовать БД)


 
umbra ©   (2006-05-30 17:02) [2]


> я думал запускать таймер и смотреть каждую секунду наступило
> ли время события,

именно так работают все планировщики заданий


 
antonn ©   (2006-05-30 17:44) [3]

я в своем планировщике ищу ближайшее задание, и в переменную (double) запоминаю это время, а потом ежесекундно проверяю текущее и в переменной. Когда доходит до >=, то ищу следующее ближайшее и выполняю то, что должно было выполнится сейчас. Если заданий на сегодня нет, то обновляю в 00:00. Ну и при каждом запуске программы обновляю. Всеже лучше, чем проверять время у кучи заданий (да к тому так нет ограничения на их кол-во).


 
umbra ©   (2006-05-30 17:48) [4]

а если у двух событий одно и то же время возникновения?


 
antonn ©   (2006-05-30 17:52) [5]

ну находит ближайшее, запомимает это время. При наступлении запомненого времени, пробегает весь список с событиями и выполняет те, у которых установленно это время. Вот:)


 
tesseract ©   (2006-05-30 17:55) [6]


> Исключать записи, время которых прошло (тут имеет смысл
> использовать БД)


на кой, типизированного файла за глаза.


 
antonn ©   (2006-05-30 18:03) [7]

кстати да, я типизированый файл и использую:)


 
Юрий Зотов ©   (2006-05-30 18:42) [8]

Зачем таймер и лишние проверки? Найти ближайшее время, создать поток и усыпить его до этого времени.


 
begin...end ©   (2006-05-30 18:54) [9]

> Std ©   (30.05.06 16:01)

> я думал запускать таймер и смотреть каждую секунду наступило
> ли время события, но че то мне кажется что акой метод немного
> не правильный

Действительно, такой метод немного неправильный. Потому что срабатывания таймера каждую секунду не требуется. А требуется только одно срабатывание (которое должно просигнализировать о наступлении события). Поэтому вычисляем, сколько времени осталось до события, устанавливаем соответствующий интервал таймеру и запускаем его. Тогда первое срабатывание таймера и будет соответствовать времени наступления события.

Или используем CreateWaitableTimer.


 
antonn ©   (2006-05-30 18:57) [10]

begin...end ©   (30.05.06 18:54) [9]
а если там 23 часа интервал?


 
begin...end ©   (2006-05-30 19:03) [11]

> antonn ©   (30.05.06 18:57) [10]

...то что?


 
parovoZZ ©   (2006-05-30 19:09) [12]


> а если там 23 часа интервал?


Да хоть месяц.


 
Std ©   (2006-05-30 19:59) [13]

begin...end
а если заданий несколько? это прийдется создавать несколько таймеров?


 
Iehbr   (2006-05-30 20:09) [14]

to STD
смотри [9]


 
begin...end ©   (2006-05-30 21:10) [15]

> Std ©   (30.05.06 19:59) [13]

Если речь о TTimer, то изменять интервал таймера (а значит, и пересоздавать системный объект "таймер"), действительно, придётся. Но в каждый момент времени будет работать только один таймер.

Просматриваем список заданий, находим ближайшее по времени. Запускаем таймер для него. Когда он срабатывает, находим следующее ближайшее задание, рассчитываем новый интервал и перезапускаем таймер.


 
antonn ©   (2006-05-30 22:12) [16]

begin...end ©   (30.05.06 19:03) [11]
просто ходили слухи, что у таймера есть ограничение на размер интервала... Но это слухи, видимо, порожденные недостаточной точностью на больших интервалах:)
При сильной загрузке системны, таймер должен пропускать "тики", т.ч. точность будет не ахти какая, куда лучше привязываться на реальное время(имхо).


 
Kolan ©   (2006-05-30 22:17) [17]


> antonn ©   (30.05.06 22:12) [16]

Первый раз слышу. Наоборот на малых интервалах точность не обеспечивается...


 
antonn ©   (2006-05-30 22:18) [18]

Kolan ©   (30.05.06 22:17) [17]
больше интервал - больше кол-ва "подвисонов" => меньше точность:) я не про милисекунды, я про целые часы:)


 
StriderMan ©   (2006-05-31 15:09) [19]

сортировать все события по времени возникновения, и выставлять таймер на интервал времени до ближайшего события.

Если вдруг точность будет никакая, ставить таймер на некоторое время раньше, и начиная с этого времени проверять тем же или другим таймером раз в скажем 500мсек реальное время.


 
antonn ©   (2006-05-31 15:33) [20]

StriderMan ©   (31.05.06 15:09) [19]
гемморой, неправда-ли? :)
что значит "на некоторое время раньше"? понятие абсолютно расплывчатое...

не такая уж и нагрузка на систему, проверять раз в секунду 2 числа - текущее время и значение в переменной... Т.ч. нет ничего лучше, чем жить в реальном времени - а вдруг я часы переведу (или ОС сама, у меня минимум 2 раза в год сама переводит:)), ну и чего тогда с этими интервалами делать?


 
StriderMan ©   (2006-05-31 16:10) [21]

да в принципе нагрузка действительно мизерная, согласен что это проще и надежнее.

но ... неспортивно ;)
шутка


 
Мефисто   (2006-06-01 20:02) [22]

antonn  ©   (30.05.06 22:18) [18]

Щяс свой слушок добавлю :) Сия неточность вызвана тем, что у таймера низкий приоритет всистеме. При сильной загрузке есть шанс, что таймер может пропустить несколько тиков и не отработать событие OnTimer. Вот такой слушок ;)


 
antonn ©   (2006-06-01 20:56) [23]

Мефисто   (01.06.06 20:02) [22]
ну у меня еще ниразу раймер не пропускал Ontimer из-за пропусков тиков. Скорее вся прога просто тормозит, но срабатывает.
А в своей проверке нужно проверять не просто "равно", а еще и "больше", т.ч. если проскочит, то тоже не велика беда:)



Страницы: 1 вся ветка

Текущий архив: 2006.06.18;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.039 c
3-1145888783
linx
2006-04-24 18:26
2006.06.18
Изоляция транзакции


8-1137319806
exime
2006-01-15 13:10
2006.06.18
TJpegImage.LoadFromStream


11-1127963931
dvk
2005-09-29 07:18
2006.06.18
KOL+MCK 2.13/ Проблемы с установкой


2-1149059536
Perf2k2
2006-05-31 11:12
2006.06.18
Необходимо как-то хранить глобальную переменную с ее значением


1-1147332028
leonidus
2006-05-11 11:20
2006.06.18
Как отображать в TLabel русский, испанский и английский текст?