Форум: "Начинающим";
Текущий архив: 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.012 c