Есть идея сделать шедулер с точностью до день час минута секунда ... мм вот только нехочется перебирать все задачи и сранвивать время каждую секунду... можно сделать например так ужать время в 2 байта... учитывая время не 24 часа а 12 =) 4бит на час (0 - 12) 6бит на минуты (0 - 59) 6бит на секунды (0 - 59) итого можно значит создать lookup таблицу размером всего 65кб... и сооственно будет гораздо проще сразу вявлять то задание что должно сработать +) или может есть способы проще?... понятно что перебирать даже 1000 заданий можно и за секунду... но... не красиво
Манипуляции с битами, таблица на 65кб... и чем это должно быть проще, зачем точность до секунды (ты уверен что сможешь правильно обеспечить выполнение задания если не получишь процессорного времени несколько секунд)? Для 1000 заданий, достаточно 1кб, ставь таймер на минуту и сравнивай двордами
Да я так и делал дворды сравнивал и всё... ну впринцыпи да... ты прав.. зачем с точностью до секунды... прсото малоли думал ... как нить красиво сделать +)
хотяяяя +): 3 байта на день недели 5 байт на 24 часа.... 6 байт на минуты... тогда делаем лукап таблицу +) туда кидаем адрес функции что надо вызывать ии... call lookup[time] +) ну само собой првоерить не нуль ли там адрес функции... хотя если задание разные а выполняться должны в одно время ...мм ну ладно всё таки перебор
А зачем так сложно извращаться? Не проще ли упорядочить все задания по времени и хранить в качестве момента срабатывания для каждой задачи номер секунды начиная с некоторого момента. Тогда "поиск" сведется к перемещению указателя на следующую позицию в массиве. Правда процедура вычисления времени следующего несколько усложнится (нужно будет выполнять вставку в массив двойных слов), но это скорее всего будет быстрее, чем просто каждый раз бегать по всему массиву.
Да была и такая идея.. но вначале надо вычеслить правильные значения до времени Х.... ммм... вот и думаю как бы лучше...
это делается один раз при добавлении/удалении задачи. Зато потом тривиально Sleep(time); Exec(task); ++i;
я понимаю.. что тревиально .. имеем конечную дату и начальную.. 1 класс... я не про то... хм... прсото как бы пооптимальнее... пока вижу только два... этот и тупо проходить и сравнивать дворды... +)
Тупо сравнивать дворды тоже нельзя, даже точность до минуты иногда можно не выполнить, допустим, есть у тебя задание запустить 2 проги в 18.00 и 18.01: Комп подключен к сети, в 17.59 вырубили сервер, в 18.00 ты делаешь CreateProcess, винда начинает искать %PATH%, ждет х.з. сколько минут пока не выйдет таймаут опроса сервера, 18.02 ура таймаут вышел прога запущена, дальше сравниваем 18.02 и 18.01 не совпадает, результат 2-я прога не запущена Есс-но это все грубо говоря, надо тестировать и предусматривать обработку таких ситуаций, оставлять како-то зазор, что прога должна запустится с 18.00 до 18.05 и перед запуском проверять GetExitCodeProcess(STILL_ACTIVE)
bogrus есть такая штука в *nix - anacron называется. Она умеет выполнять задания, время которых было пропущено из-за отключения компа. Надо просто проставлять отметку выполнения (дату) и при построении списка не бруть следующую задачу от текущего времени а и запускать все предыдущие для которых нет отметки о выполнении.