Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Выполнение действий по расписанию [D7, WinXP]


Yuri Btr ©   (2004-09-11 11:59:00) 

Ув. мастера, подскажите кто делал в своих программах функцию запуска определённых действий по расписанию. Как можно представить в памяти само расписание (например учитывая часы и минуты)?
Первое что сделал - создал экземпляр TStrings и четные строки с 0 содержат час, а нечетные содержат минуты. Затем каждую секунду по таймеру идет сверка текущего времени и если находится в списке такое время то запуск функции.
Можно вместо TStrings  конечно создать и TList с указателями на объекты TdateTime и перебирать их каждую секунду.
Новсё это как то некрасиво и довольно много работы проводится каждую секунду, может у кого то есть идеи насчет оптимизации этой функции.
Заранее спасибо.


Yuri Btr   (2004-09-11 14:42:00) [1]

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

Пример. (нужное время срабатывания SomeProc 12:02:любая секунда, интервал 1000 мс * 60=60000 мс)
1.Тик таймера: 12:01:59
2.Проверка: время не наступило
3.Система/приложение занято длительное время
4.Тик таймера: 12:03:00
5.Проверка: время не наступило

Про WM_TIMECHANGE и так всё ясно.


Profi   (2004-09-11 13:58:00) [2]

Yuri Btr ©   (11.09.04 11:59)
Смотри http://www.ASprofi.narod.ru/org1.1.0.exeпонравится, могу поделиться частью кода!


Mim1   (2004-09-11 13:39:00) [3]

и еще, может вместо исполдьзования таймер воспользоваться потоком со сверхвысоким приоритетом, выполняя в нем sleep? Дабы не пропускать события изза загруженности системы.


Mim1   (2004-09-11 13:37:00) [4]


> 1. проверить первый элемент списка-расписания - если время
> не наступило, то устанавливаем таймер на время разности
> между временем сработки этого элемента списка-расписания
> и текущим моментом времени; выход

Есть мизерное замечание. Таймер может немножко "задержаться" так что надо проверять не больше или равно ли время запланированного.


Rem   (2004-09-11 13:24:00) [5]

> т.к. время может измениться в системе

WM_TIMECHANGE


Verg   (2004-09-11 13:22:00) [6]

Все верно, только список времен событий надо сделать сортированным.
Тогда при сработке таймера нет надобности шерстить весь список-расписание, достаточно
1. проверить первый элемент списка-расписания - если время не наступило, то устанавливаем таймер на время разности между временем сработки этого элемента списка-расписания и текущим моментом времени; выход
2. выполняем действие предусмотренное данным элементом расписания
3. удаляем это элемент списка-расписания
4. Переход к п. 1.


Yuri Btr   (2004-09-11 13:17:00) [7]

to Rem
Windows Sheduler  - вы имеете в виду встроенный Task Sheduler (команда "at" и т.д) - мне это не подходит
каждую секунду, т.к. время может измениться в системе (например при синхронизациии с сервером или пользователем) возможны пропуски в запуске функции.
Я знаю что TStrings мало подходит для этого, поэтому и спрашиваю.


Rem   (2004-09-11 13:11:00) [8]

1. Использовать Windows Sheduler
2. По поводу разработки:
- у каждого элемента TStrings есть свойство Object, куда можно записать указатель на TDateTime;
- если "учитывая часы и минуты", то зачем таймер на каждую секунду?


Наверх

Титульная страница Поиск, карта сайта Написать письмо