Форум: "Основная";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];
ВнизВыполнение действий по расписанию Найти похожие ветки
← →
Yuri Btr © (2004-09-11 11:59) [0]Ув. мастера, подскажите кто делал в своих программах функцию запуска определённых действий по расписанию. Как можно представить в памяти само расписание (например учитывая часы и минуты)?
Первое что сделал - создал экземпляр TStrings и четные строки с 0 содержат час, а нечетные содержат минуты. Затем каждую секунду по таймеру идет сверка текущего времени и если находится в списке такое время то запуск функции.
Можно вместо TStrings конечно создать и TList с указателями на объекты TdateTime и перебирать их каждую секунду.
Новсё это как то некрасиво и довольно много работы проводится каждую секунду, может у кого то есть идеи насчет оптимизации этой функции.
Заранее спасибо.
← →
Rem (2004-09-11 13:11) [1]1. Использовать Windows Sheduler
2. По поводу разработки:
- у каждого элемента TStrings есть свойство Object, куда можно записать указатель на TDateTime;
- если "учитывая часы и минуты", то зачем таймер на каждую секунду?
← →
Yuri Btr © (2004-09-11 13:17) [2]to Rem
Windows Sheduler - вы имеете в виду встроенный Task Sheduler (команда "at" и т.д) - мне это не подходит
каждую секунду, т.к. время может измениться в системе (например при синхронизациии с сервером или пользователем) возможны пропуски в запуске функции.
Я знаю что TStrings мало подходит для этого, поэтому и спрашиваю.
← →
Verg © (2004-09-11 13:22) [3]Все верно, только список времен событий надо сделать сортированным.
Тогда при сработке таймера нет надобности шерстить весь список-расписание, достаточно
1. проверить первый элемент списка-расписания - если время не наступило, то устанавливаем таймер на время разности между временем сработки этого элемента списка-расписания и текущим моментом времени; выход
2. выполняем действие предусмотренное данным элементом расписания
3. удаляем это элемент списка-расписания
4. Переход к п. 1.
← →
Rem (2004-09-11 13:24) [4]> т.к. время может измениться в системе
WM_TIMECHANGE
← →
Mim1 © (2004-09-11 13:37) [5]
> 1. проверить первый элемент списка-расписания - если время
> не наступило, то устанавливаем таймер на время разности
> между временем сработки этого элемента списка-расписания
> и текущим моментом времени; выход
Есть мизерное замечание. Таймер может немножко "задержаться" так что надо проверять не больше или равно ли время запланированного.
← →
Mim1 © (2004-09-11 13:39) [6]и еще, может вместо исполдьзования таймер воспользоваться потоком со сверхвысоким приоритетом, выполняя в нем sleep? Дабы не пропускать события изза загруженности системы.
← →
Profi © (2004-09-11 13:58) [7]Yuri Btr © (11.09.04 11:59)
Смотри http://www.ASprofi.narod.ru/org1.1.0.exe понравится, могу поделиться частью кода!
← →
Yuri Btr © (2004-09-11 14:42) [8]Спасибо всем за ответы.
Проверку на совпадение времени в моём случае действительно можно проводить один раз в минуту, навряд ли система будет так сильно загружена, что следующий тик таймера проскочит через одну минуту и мы не попадём на нужную.
Пример. (нужное время срабатывания SomeProc 12:02:любая секунда, интервал 1000 мс * 60=60000 мс)
1.Тик таймера: 12:01:59
2.Проверка: время не наступило
3.Система/приложение занято длительное время
4.Тик таймера: 12:03:00
5.Проверка: время не наступило
Про WM_TIMECHANGE и так всё ясно.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.037 c