Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1094819915
vigo
2004-09-10 16:38
2004.09.26
Формат времени DateTimePicker


3-1093349602
Карелин Артем
2004-08-24 16:13
2004.09.26
FB 1.5.1 и индекс по выражению.


4-1092209852
CHEK
2004-08-11 11:37
2004.09.26
APIHOOKS


14-1094619189
syte_ser78
2004-09-08 08:53
2004.09.26
ДОЖДАЛСЯ!!!!


1-1095002737
Макс
2004-09-12 19:25
2004.09.26
Word





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский