Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.06.18;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.011 c
1-1146814280
pargo
2006-05-05 11:31
2006.06.18
Корректная работа с памятью.


15-1148280138
Denis
2006-05-22 10:42
2006.06.18
Программирование микроконтроллеров Atmel - AVR Assembler


15-1148360190
БарЛог
2006-05-23 08:56
2006.06.18
И это - Москва!


2-1148848414
Massive
2006-05-29 00:33
2006.06.18
как очистить листбокс


2-1148909221
ksenia
2006-05-29 17:27
2006.06.18
перестановка символов





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский