C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Дайте совет: как написать планировщик?
serg128
Отправлено: 27.01.2005, 18:27


Дежурный стрелочник

Группа: Участник
Сообщений: 46



Т.е. задача такая: пишу планировщик на С++ Билдер. Т.е. висит программа в трее, скучает, но в определенный день/месяц/год/часы/минуты делать определенные действия. Логичнее всего — иметь какую — либо базу данных, но задача — минимальный размер (до 1Мб — экзешник) и никакого левака типа БДЕ и прочего. Ресурсы тоже надо экономить. Рад любым советам.
Sl@Sh
Отправлено: 27.01.2005, 19:16


Мастер участка

Группа: Участник
Сообщений: 383



Извините, но зачем тут БД ? В БД обычно хранится информация, а планировшику она нужна только до наступления события. Просто
создайте файл, в котором и запишите события, а потом можно так :
1) При запуске проги, если дата совпала, то ожидать те события, которые отмечены по данной дате. Это чтобы постоянно не проверять
дату, а только время.

2) Отсортировать события по времени так, чтобы ожидать не все, а только ближайшее, а после его наступления слудующее.



P.S.: Удачи !
Gedeon
Отправлено: 27.01.2005, 19:42


Ветеран

Группа: Модератор
Сообщений: 1742



Вообще говоря тут хочется посоветовать писать на апи, да и хранить данные лучше всего в реестре, по поводу сортировки и ожидания ожидания события идея великолепная.
serg128
Отправлено: 27.01.2005, 21:39


Дежурный стрелочник

Группа: Участник
Сообщений: 46



Спасибо за совет, конечно, но:
планирую использовать текстовый файл (ини)
непонятно, как сделать сортировку
и самое важное: ненужные записи из файла надо как-то удалять, а без перезаписи файла(идиотизм) непонятно, как их удалять.

И никто мне подсказать неможет.
AVC
Отправлено: 28.01.2005, 09:59


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

и самое важное: ненужные записи из файла надо как-то удалять, а без перезаписи файла(идиотизм) непонятно, как их удалять.

Зачитали файл при старте планировщика в структуры в памяти. Пока планироващик работает — работаете с памятью. При завершении работы или в контрольных точках сбрасываете файл на диск.
Gedeon
Отправлено: 28.01.2005, 10:24


Ветеран

Группа: Модератор
Сообщений: 1742



CODE

virtual void __fastcall DeleteKey(const AnsiString Section, const AnsiString Ident);


CODE

virtual void __fastcall EraseSection(const AnsiString Section);


Отредактировано Gedeon — 28/01/2005, 11:27
full_lamer
Отправлено: 28.01.2005, 10:41


Машинист паровоза

Группа: Участник
Сообщений: 225



может я конечно не прав — но чем втроенный планировщик виндовс не устраивает... он наверняка оптимизирован под не пожирание ресурсов и весит меньше... а возможности предоставляет тож не шуточные...
Sl@Sh
Отправлено: 28.01.2005, 19:29


Мастер участка

Группа: Участник
Сообщений: 383



to full_lamer : Если по-вашему, то и IE, и WMP и.т.п. многих тоже устраивает, но от этого браузеров и проигрывателей меньше не становится biggrin.gif

Более того, сейчас масса программ на все случаи жизни. И что ? Можно их больше не создавать ?

Просто даже своим продуктом пользоваться приятней раз в 100. И ошибку любую можно исправить и под себя наточить.
full_lamer
Отправлено: 29.01.2005, 09:48


Машинист паровоза

Группа: Участник
Сообщений: 225



2Sl@Sh
это конечно да... я просто сказал, что если такой острой необходимости в планировщике, который будет делать что то эдакое (например по сигналу от нескольких внешних устройств делать чтото что запусит еще несколько устройств biggrin.gif) нет... то можно обойтись и стандартными срадствами... зачем же изобретать велосипед?

хотя — чего греха таить я стараюсь внедрить только свои программы на производство... нежели покупать и внедрять готовые... cool.gif
Иван
Отправлено: 29.01.2005, 10:43


Машинист паровоза

Группа: Участник
Сообщений: 207



Согласен с Sla@sh , думаю что наверняка идея состоит не в написании программы — планировщика, которой нужно че то делать с системой в определенное время (здесь я думаю стандартного будет вполне достаточно!) , а напсисать СВОЙ дневник-планировщик. И туда в него можно столько всего накидать... ohmy.gif
xim
Отправлено: 29.01.2005, 13:21


Станционный диспетчер

Группа: Участник
Сообщений: 143



Абсолютно согласен с full_lamer, но если все-таки так хочется позаниматься лишней работой, то:

1.1 Хранение параметров заданий осуществляется в DBF. Доступ к DBF (естессно без BDE и прочей) можно найти в сырцах плагина
L smile.gif wink.gif kDBF где-то здесь: plugring.farmanager.com

1.2 Хранение ПЗ осуществляется в реестре WND — актуально при написании вышего планировщика в виде сервиса (единственный достойный вариант для данной задачи)

2. Принцип работы:

Реализуется механизм работы до ближайшего события:

- Делаем таймер, срабатывающий раз в сутки (для машин, которые не выключаются).
- При запуске проги и срабатывании таймера делаем расчет

если первое по списку событие срабатывает в ближайшие сутки, то
<
Текущие дата+время -> в милисекунды
Дата+время события -> в милисекунды
(via GetSystemTime <структура systemtime>)
Разность полученных значений.
> — для каждого события в течение данных суток -> в вектор

Для каждого значения в векторе устанавливаем ONESHOT таймер

РЕКОМЕНДУЮ таймер из mmsystem:

timeSetEvent(<милисек>, <точность>, ,(DWORD) <пойнтер на данные, используемые при обработке событий [или на форму]>, TIME_ONESHOT);

Чем ниже <точность> (значение в милисеках больше) — тем шустрее прога

CODE

//<callback функция>
typedef void (CALLBACK TIMECALLBACK)(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2);
typedef TIMECALLBACK FAR *LPTIMECALLBACK;


Ну а в CALLBACK-функции делаем то, что задумали


Вернуться в Вопросы программирования в C++Builder