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

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

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

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

Сообщение McLion » 29.04.2015 13:16:36

Всем привет,

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

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

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

Сообщение resident » 29.04.2015 15:32:18

"Сотни и больше" тысяч, миллионов? :)
1. Время = число. При запуске проги сделать отсортированный по времени массив заданий. Каждую секунду бинарный поиск в массиве по времени. Потом проверка предыдущих и последующих индексов на совпадение времени, если несколько заданий запланировано на одно время. При тысяче заданий алгоритм поиска потребует всего 10 сравнений.
2. Хэширование со связными списками. При запуске необходимо заполнить всю таблицу. При поиске время преобразуем в хэш. В хэш таблице просматриваем весь связный список, помещенный в найденную ячейку таблицы. Если время элемента списка совпадает с искомым, то это одно из искомых заданий. Списки так же можно сортировать и проводить по ним поиск, а не просто просматривать все целиком. Поиск может быть мгновенным (только хэш вычислить и сделать одно сравнение), зависит от многих факторов.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

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

Сообщение McLion » 11.05.2015 16:06:48

Я время храню в БД, могу ли я с помощью ДБ улучшить или упростить поиск? Как то с помощью SELECT или грузить все время в Array или StringList и там искать на совпадение?
Аватара пользователя
McLion
постоялец
 
Сообщения: 332
Зарегистрирован: 06.02.2015 18:41:00

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

Сообщение Sharfik » 11.05.2015 16:23:32

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

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

Сообщение McLion » 11.05.2015 16:26:58

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


А зачем записи кешировать?
Аватара пользователя
McLion
постоялец
 
Сообщения: 332
Зарегистрирован: 06.02.2015 18:41:00

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

Сообщение Sharfik » 11.05.2015 16:57:16

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

Сам писал про таймер, будильник и выборки. Если задач набирается много, и не на один месяц, то зачем гонять по списку каждую минуту все записи, включая те что будут через месяц.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 809
Зарегистрирован: 20.07.2013 01:04:30

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

Сообщение McLion » 11.05.2015 17:02:14

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

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


Ааа.. понял, ты наверное Cache имел ввиду, а я понял Hash... я из-за бугра, ваш сленг не до конца догоняю. :mrgreen:
Аватара пользователя
McLion
постоялец
 
Сообщения: 332
Зарегистрирован: 06.02.2015 18:41:00

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

Сообщение resident » 11.05.2015 22:28:58

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

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

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

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

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

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

з.ы. Насчет СУБД у меня только теория :)
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

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

Сообщение Vadim » 12.05.2015 10:04:18

Список отсортированный по времени, только не поиск по нему, а запоминать ID задания, которое будет запускаться следующим и смотреть за временем. Как время подошло - запускается задание и выбирается следующее по времени.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 260

Рейтинг@Mail.ru