Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.26;
Скачать: CL | DM;

Вниз

Выполнение действий по расписанию   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.042 c
1-1094567567
Vova
2004-09-07 18:32
2004.09.26
Открытие файла в бинарном режиме


14-1094206481
kvit
2004-09-03 14:14
2004.09.26
Модем и регистр S0!


14-1094412910
Soft
2004-09-05 23:35
2004.09.26
Технические проблемы с совестью.


14-1094505281
Jus
2004-09-07 01:14
2004.09.26
Nt технологии


6-1090190924
Лев Ландау
2004-07-19 02:48
2004.09.26
Как сгенерить html-страницу и поместить ее в TWebBrowser?