Будильник для заданий?
Модератор: Модераторы
Будильник для заданий?
Всем привет,
я написал программу для обработки заданий, типа To-Do-List, теперь нужен будильник который должен напоминать о предстоящем задании. Как написать его с умом? Так как заданий может быть очень много, сотни и больше, создавать для каждого задания таймер наверное не очень мудро. А создать один таймер для всех заданий тоже как то не очень, будет ли он успевать в интервале 1 сек. проходить все задания и проверять их время? Хм.... Что подскажите?
Благодарен!
я написал программу для обработки заданий, типа To-Do-List, теперь нужен будильник который должен напоминать о предстоящем задании. Как написать его с умом? Так как заданий может быть очень много, сотни и больше, создавать для каждого задания таймер наверное не очень мудро. А создать один таймер для всех заданий тоже как то не очень, будет ли он успевать в интервале 1 сек. проходить все задания и проверять их время? Хм.... Что подскажите?
Благодарен!
"Сотни и больше" тысяч, миллионов?
1. Время = число. При запуске проги сделать отсортированный по времени массив заданий. Каждую секунду бинарный поиск в массиве по времени. Потом проверка предыдущих и последующих индексов на совпадение времени, если несколько заданий запланировано на одно время. При тысяче заданий алгоритм поиска потребует всего 10 сравнений.
2. Хэширование со связными списками. При запуске необходимо заполнить всю таблицу. При поиске время преобразуем в хэш. В хэш таблице просматриваем весь связный список, помещенный в найденную ячейку таблицы. Если время элемента списка совпадает с искомым, то это одно из искомых заданий. Списки так же можно сортировать и проводить по ним поиск, а не просто просматривать все целиком. Поиск может быть мгновенным (только хэш вычислить и сделать одно сравнение), зависит от многих факторов.
1. Время = число. При запуске проги сделать отсортированный по времени массив заданий. Каждую секунду бинарный поиск в массиве по времени. Потом проверка предыдущих и последующих индексов на совпадение времени, если несколько заданий запланировано на одно время. При тысяче заданий алгоритм поиска потребует всего 10 сравнений.
2. Хэширование со связными списками. При запуске необходимо заполнить всю таблицу. При поиске время преобразуем в хэш. В хэш таблице просматриваем весь связный список, помещенный в найденную ячейку таблицы. Если время элемента списка совпадает с искомым, то это одно из искомых заданий. Списки так же можно сортировать и проводить по ним поиск, а не просто просматривать все целиком. Поиск может быть мгновенным (только хэш вычислить и сделать одно сравнение), зависит от многих факторов.
Я время храню в БД, могу ли я с помощью ДБ улучшить или упростить поиск? Как то с помощью SELECT или грузить все время в Array или StringList и там искать на совпадение?
Смотря какой объем. Если в программе сделать раз в сутки выборку записей назначенных на сегодня и кеширование их в массив(список дольше обходить), то думаю меньше нагрузки от программы будет. Но надо чтобы она в 00:00 часов повторила это действо, если ее не выключали.
Sharfik писал(а):Смотря какой объем. Если в программе сделать раз в сутки выборку записей назначенных на сегодня и кеширование их в массив(список дольше обходить), то думаю меньше нагрузки от программы будет. Но надо чтобы она в 00:00 часов повторила это действо, если ее не выключали.
А зачем записи кешировать?
Смотря какой объем.
Сам писал про таймер, будильник и выборки. Если задач набирается много, и не на один месяц, то зачем гонять по списку каждую минуту все записи, включая те что будут через месяц.
Sharfik писал(а):Смотря какой объем.
Сам писал про таймер, будильник и выборки. Если задач набирается много, и не на один месяц, то зачем гонять по списку каждую минуту все записи, включая те что будут через месяц.
Ааа.. понял, ты наверное Cache имел ввиду, а я понял Hash... я из-за бугра, ваш сленг не до конца догоняю.
Sharfik писал(а):Но надо чтобы она в 00:00 часов повторила это действо, если ее не выключали.
А если это действо занимает минуту, при этом (уж наверное и не важно когда) будет добавлено задание, которое должно выполнится через пару секунд после добавления?
Поэтому наверное массив - худший вариант хранения.
Или хеширование или еще что-то. Нужно проверить тормознутость каждого варианта.
1) Хеширование со списками
2) XML Лазаруса
3) СУБД
1, 2 "всю" базу при запуске грузить в хэш или XML. (Или не всю, а что необходимо.).
XML для каждого времени (в секундах) свой узел, а в нем узлы заданий для этого времени. Бинарный поиск легко. Вставка нового задания легко (предварительно поискав нужный узел, вставить новый узел времени или добавить в существующий).
Наверняка лучшим будет вариант самой СУБД.
Создает индекс так же используя похожие методы:
1) хэширование (или В-деревья), поиск бинарный
2) использование кластерного индекса, похоже на использование XML Лазаруса (узлы уже изначально упорядочены).
http://habrahabr.ru/post/141767/
Если СУБД может работать с кластерным индексом, то использовать СУБД, иначе XML Лазаруса.
з.ы. Насчет СУБД у меня только теория
Список отсортированный по времени, только не поиск по нему, а запоминать ID задания, которое будет запускаться следующим и смотреть за временем. Как время подошло - запускается задание и выбирается следующее по времени.
