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 и.т.п. многих тоже устраивает, но от этого браузеров и проигрывателей меньше не становится
Более того, сейчас масса программ на все случаи жизни. И что ? Можно их больше не создавать ?
Просто даже своим продуктом пользоваться приятней раз в 100. И ошибку любую можно исправить и под себя наточить.
|
|
full_lamer |
Отправлено: 29.01.2005, 09:48 |
|
Машинист паровоза
Группа: Участник
Сообщений: 225
|
2Sl@Sh
это конечно да... я просто сказал, что если такой острой необходимости в планировщике, который будет делать что то эдакое (например по сигналу от нескольких внешних устройств делать чтото что запусит еще несколько устройств ) нет... то можно обойтись и стандартными срадствами... зачем же изобретать велосипед?
хотя — чего греха таить я стараюсь внедрить только свои программы на производство... нежели покупать и внедрять готовые...
|
|
Иван |
Отправлено: 29.01.2005, 10:43 |
|
Машинист паровоза
Группа: Участник
Сообщений: 207
|
Согласен с Sla@sh , думаю что наверняка идея состоит не в написании программы — планировщика, которой нужно че то делать с системой в определенное время (здесь я думаю стандартного будет вполне достаточно!) , а напсисать СВОЙ дневник-планировщик. И туда в него можно столько всего накидать...
|
|
xim |
Отправлено: 29.01.2005, 13:21 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 143
|
Абсолютно согласен с full_lamer, но если все-таки так хочется позаниматься лишней работой, то:
1.1 Хранение параметров заданий осуществляется в DBF. Доступ к DBF (естессно без BDE и прочей) можно найти в сырцах плагина
L 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-функции делаем то, что задумали
|
|