Будильник для заданий?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Аватара пользователя
McLion
постоялец
Сообщения: 332
Зарегистрирован: 06.02.2015 17:41:00

Будильник для заданий?

Сообщение McLion »

Всем привет,

я написал программу для обработки заданий, типа To-Do-List, теперь нужен будильник который должен напоминать о предстоящем задании. Как написать его с умом? Так как заданий может быть очень много, сотни и больше, создавать для каждого задания таймер наверное не очень мудро. А создать один таймер для всех заданий тоже как то не очень, будет ли он успевать в интервале 1 сек. проходить все задания и проверять их время? Хм.... Что подскажите?

Благодарен!
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

"Сотни и больше" тысяч, миллионов? :)
1. Время = число. При запуске проги сделать отсортированный по времени массив заданий. Каждую секунду бинарный поиск в массиве по времени. Потом проверка предыдущих и последующих индексов на совпадение времени, если несколько заданий запланировано на одно время. При тысяче заданий алгоритм поиска потребует всего 10 сравнений.
2. Хэширование со связными списками. При запуске необходимо заполнить всю таблицу. При поиске время преобразуем в хэш. В хэш таблице просматриваем весь связный список, помещенный в найденную ячейку таблицы. Если время элемента списка совпадает с искомым, то это одно из искомых заданий. Списки так же можно сортировать и проводить по ним поиск, а не просто просматривать все целиком. Поиск может быть мгновенным (только хэш вычислить и сделать одно сравнение), зависит от многих факторов.
Аватара пользователя
McLion
постоялец
Сообщения: 332
Зарегистрирован: 06.02.2015 17:41:00

Сообщение McLion »

Я время храню в БД, могу ли я с помощью ДБ улучшить или упростить поиск? Как то с помощью SELECT или грузить все время в Array или StringList и там искать на совпадение?
Аватара пользователя
Sharfik
энтузиаст
Сообщения: 839
Зарегистрирован: 20.07.2013 01:04:30

Сообщение Sharfik »

Смотря какой объем. Если в программе сделать раз в сутки выборку записей назначенных на сегодня и кеширование их в массив(список дольше обходить), то думаю меньше нагрузки от программы будет. Но надо чтобы она в 00:00 часов повторила это действо, если ее не выключали.
Аватара пользователя
McLion
постоялец
Сообщения: 332
Зарегистрирован: 06.02.2015 17:41:00

Сообщение McLion »

Sharfik писал(а):Смотря какой объем. Если в программе сделать раз в сутки выборку записей назначенных на сегодня и кеширование их в массив(список дольше обходить), то думаю меньше нагрузки от программы будет. Но надо чтобы она в 00:00 часов повторила это действо, если ее не выключали.


А зачем записи кешировать?
Аватара пользователя
Sharfik
энтузиаст
Сообщения: 839
Зарегистрирован: 20.07.2013 01:04:30

Сообщение Sharfik »

Смотря какой объем.

Сам писал про таймер, будильник и выборки. Если задач набирается много, и не на один месяц, то зачем гонять по списку каждую минуту все записи, включая те что будут через месяц.
Аватара пользователя
McLion
постоялец
Сообщения: 332
Зарегистрирован: 06.02.2015 17:41:00

Сообщение McLion »

Sharfik писал(а):
Смотря какой объем.

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


Ааа.. понял, ты наверное Cache имел ввиду, а я понял Hash... я из-за бугра, ваш сленг не до конца догоняю. :mrgreen:
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

Sharfik писал(а):Но надо чтобы она в 00:00 часов повторила это действо, если ее не выключали.

А если это действо занимает минуту, при этом (уж наверное и не важно когда) будет добавлено задание, которое должно выполнится через пару секунд после добавления?
Поэтому наверное массив - худший вариант хранения.

Или хеширование или еще что-то. Нужно проверить тормознутость каждого варианта.
1) Хеширование со списками
2) XML Лазаруса
3) СУБД

1, 2 "всю" базу при запуске грузить в хэш или XML. (Или не всю, а что необходимо.).
XML для каждого времени (в секундах) свой узел, а в нем узлы заданий для этого времени. Бинарный поиск легко. Вставка нового задания легко (предварительно поискав нужный узел, вставить новый узел времени или добавить в существующий).

Наверняка лучшим будет вариант самой СУБД.
Создает индекс так же используя похожие методы:
1) хэширование (или В-деревья), поиск бинарный
2) использование кластерного индекса, похоже на использование XML Лазаруса (узлы уже изначально упорядочены).
http://habrahabr.ru/post/141767/

Если СУБД может работать с кластерным индексом, то использовать СУБД, иначе XML Лазаруса.

з.ы. Насчет СУБД у меня только теория :)
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Список отсортированный по времени, только не поиск по нему, а запоминать ID задания, которое будет запускаться следующим и смотреть за временем. Как время подошло - запускается задание и выбирается следующее по времени.
Ответить