Главная страница
    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.47 MB
Время: 0.038 c
6-1090364380
MIGUR
2004-07-21 02:59
2004.09.26
ЧЕКЕР


1-1094541629
KIR
2004-09-07 11:20
2004.09.26
Народ, кто уже работает с D8?


14-1094801301
Kray
2004-09-10 11:28
2004.09.26
Установка своего компонента


11-1080823624
nester
2004-04-01 16:47
2004.09.26
Почему иногда MsgOk выскакивает за формой?


3-1093863655
Russko
2004-08-30 15:00
2004.09.26
Проблема с точкой и запятой.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский