Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сделать планировщик? замучался... не получается 
:(
    Опции темы
h2o
Дата 30.11.2005, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 19.8.2005

Репутация: 1
Всего: 1



1. указывать все настройки (их туча!!!)
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
Демо
Дата 30.11.2005, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Цитата(h2o @ 30.11.2005, 13:55)
1. указывать все настройки (их туча!!!)


Так можно отделить мух от котлет;)

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

Как тебе такой вариант?


--------------------
    
PM MAIL ICQ Skype   Вверх
Alexeis
Дата 30.11.2005, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459





--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
h2o
Дата 30.11.2005, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 19.8.2005

Репутация: 1
Всего: 1



по началу я тоже так хотел, но: я неумею писать сервисов и вряд ли разберусь! (хотя это вообще был бы идеальный вариант, т.к. юзер бы вообще ничего не видел.)
Я думал, и мне больше по душе понравился вариант форма+трэй+поток+автозапуск проги при загрузке винды!
Прога висит в трее, а поток (hThread или Таймер или WaitAbleTimer) сверяет настройки и запускает процедуру!

Самое сложное- это то что я не понимаю как реализовать проверку расписания. При запуске проги она загружает из ИНИ настройки все, при закрытии записывает. Далее из формы из ее VCL компонентов берутся настройки расписания, сравниваются и если совпало-то запускается моя процедура! А вот как проверку этих условий реализовать? Вот вся проблема?
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
Демо
Дата 30.11.2005, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Цитата(h2o @ 30.11.2005, 14:07)
по началу я тоже так хотел, но: я неумею писать сервисов и вряд ли разберусь!


Это просто. Свой первый сервис я написал, просто взяв его из справки и разобравшись.


--------------------
    
PM MAIL ICQ Skype   Вверх
Farnsworth
Дата 30.11.2005, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 30.11.2005

Репутация: нет
Всего: нет



Цитата
DateTimePicker1.Date := Now + 1; //Плюс один день - а тут как надо? Что вместо +1?
Вот так:? DateTimePicker1.Date := Now + 24часа*60минут*60секунд?

+1 - это и значит добавить один день.
Если тебе нужно добавить 1 час, то нужно сделать +1/24.
Если одну минуту: +1/24/60.
Понятно? Переменная TDateTime - это число, равное количеству дней, прошедших с 30.12.1899 (в Delphi). Если прошло пол дня, значит значение 0.5.

Цитата
такой вариант не прокатит,т.к. допустим у тебя установлено время 12.12.00 ( не буду считать, но для примера это допустим будет равно 0.51222222000000), а компьютер вернёт более точное время, допустим 0.551222222222222211 и вероятность что время совпадёт очень мала, поэтому необходимо или синхронизировать часы программы и часы системы или сравнивать строки

"Равно" конечно сравнивать нельзя, но достаточно сравнить с интервалом, равным, скажем, двум интервалам таймера (с запасом):
Код
if (ListRun[Length(ListRun)].lrTimeS<=time+Timer1.Enterval/1000/60/60/24) and (ListRun[Length(ListRun)].lrTimeS>=time-Timer1.Enterval/1000/60/60/24) then

PM MAIL   Вверх
Демо
Дата 30.11.2005, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



h2o

Если хочешь, давай вместе напишем каркас планировщика.
В случае согласия в PM дам координаты для связи.


--------------------
    
PM MAIL ICQ Skype   Вверх
h2o
Дата 30.11.2005, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 19.8.2005

Репутация: 1
Всего: 1



Farnsworth Вот ты написал что надо так:
Код

if (ListRun[Length(ListRun)].lrTimeS<=time+Timer1.Enterval/1000/60/60/24) and (ListRun[Length(ListRun)].lrTimeS>=time-Timer1.Enterval/1000/60/60/24) then

А я сравнивал даты! значения дат в любом случае должны совпадать, поэтому сравнение по "=" - допустимо. А вот время я сравнивал условием ">=", что должо было работать! а не работало! попробую с сравнением которое ты написал!

суть то в том что непонятно как реализовать саму процедуру проверки расписания (тоесть процедуру сравнения вемени)
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
Farnsworth
Дата 1.12.2005, 06:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 30.11.2005

Репутация: нет
Всего: нет



1. Когда-то я заметил, что DataTimePicker возвращает не только дату, но и время. Так что дату, полученную от DateTimePicker нужно приводить к 00 часам 00 минутам, то есть Date1:=int(DateTimePicker1.Date);

2. Точно не помню, но кажется функция Date тоже дает не 00 часов 00 минут, так что и её результат тоже нужно округлять: Date2:=int(Date);

3. В первом приведенном тобою коде ты использовал функцию Now - он тем-более даёт и дату и время, так что: Date3:=int(Now);

4. И вот тогда ты можешь сравнивать даты по "=".

5. Насчёт процедуры проверки времени - если у тебя проверка запуска по расписанию стоит в обработчике таймера, то достаточно использовать то, что я тебе написал выше. Кстати лучше даже сделать так:
Код
f (ListRun[Length(ListRun)].lrTimeS<=time+Timer1.Enterval*2/1000/60/60/24) and (ListRun[Length(ListRun)].lrTimeS>=time-Timer1.Enterval/1000/60/60/24) then

Добавилось "*2". Винда тормозит, и таймер может сработать не через 1000 милисекунд, а 1500 или даже намного больше (например, при чтении дискеты или сбойного CD-ROM'а). Лучше интервал самого таймера поставить 10 или 20 секунд (зачем каждую секунду-то проверять, винду нагружать?).

6. Не забудь, что если у твоей программы-планировщика есть возможность что-то запускать с периодом в 1 сутки, то нужно предусмотреть такой вариант, что, к примеру, твою программу (или саму Виндоуз, если твоя программа в авто-загрузчике будет прописана) могут запустить чуть позже срока срабатывания одного из ежедневных событий, например с опозданием на 1 минуту, и тогда это событие уже никогда не произойдет. Так что в случае ежедневных заданий их нужно проверять if DailySheduledTime<=Now then begin {обработчик ежедневного события}; DailySheduledTime:=Now+1; end;. Этот пример тебе уже приводил ~FoX~.

7. Если в твоей программе есть возможность установить событие на какое-то определенное время, то по той-же причине, что и в пункте 6, оно может не сработать из-за опоздания запуска программы всего лишь в 1 минуту. По-этому в модуль запуска программы лучше поставить ещё одну процедуру проверки этих событий, но проверять уже с интервалом в, скажем, 10 минут (или лучше пускай этот "запас" устанавливает сам пользователь в "Дополнительных (advanced) настройках" каких-нибудь):
Код
if (ListRun[Length(ListRun)].lrTimeS<=time+(DeltaTimeInMinutes/24/60) then

PM MAIL   Вверх
Albinos_x
Дата 1.12.2005, 07:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата(Farnsworth @ 1.12.2005, 06:17)
2. Точно не помню, но кажется функция Date тоже дает не 00 часов 00 минут, так что и её результат тоже нужно округлять: Date2:=int(Date);

не Date возвращяет чистую дату...

Цитата(Farnsworth @ 1.12.2005, 06:17)
1. Когда-то я заметил, что DataTimePicker возвращает не только дату, но и время. Так что дату, полученную от DateTimePicker нужно приводить к 00 часам 00 минутам, то есть Date1:=int(DateTimePicker1.Date);

про это я писал в начале...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Albinos_x
Дата 1.12.2005, 07:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата(Farnsworth @ 1.12.2005, 06:17)
Добавилось "*2". Винда тормозит, и таймер может сработать не через 1000 милисекунд, а 1500 или даже намного больше (например, при чтении дискеты или сбойного CD-ROM'а). Лучше интервал самого таймера поставить 10 или 20 секунд (зачем каждую секунду-то проверять, винду нагружать?).

если делать сравнение:
Цитата(h2o @ 30.11.2005, 16:35)
А вот время я сравнивал условием ">=", что

то всё расно сработает, но в этом случае сразу после срабатывания необходимо удалять задание из списка ожидания, иначе будет постоянно выполняться.... можно конечно добавить ещё к записи признак выполнялось/невыполнялось... но это имхо не эффективно...
а вот:
Цитата(h2o @ 30.11.2005, 16:35)
должо было работать! а не работало!

эт странно... попробуй в пошаговом режиме посмотреть какие данные она возвращяет и найти ошибку
Цитата(Farnsworth @ 1.12.2005, 06:17)
6. Не забудь, что если у твоей программы-планировщика есть возможность что-то запускать с периодом в 1 сутки, то нужно предусмотреть такой вариант, что, к примеру, твою программу (или саму Виндоуз, если твоя программа в авто-загрузчике будет прописана) могут запустить чуть позже срока срабатывания одного из ежедневных событий, например с опозданием на 1 минуту, и тогда это событие уже никогда не произойдет.

эт в принципе не нужно... хотя в проге можно предусмотреть вариант с настройкой проги... допутим напоминать выполненые задания... и при загрузке проги проверять какие сегодня должны были выполниться задания и отображать список...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Alexeis
Дата 1.12.2005, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



h2o я набросал каркас планировщика без таймера, со вторым
потоком. Проект сырой - нет отображения, загрузки и сохранения
заданий и еще много чего но вроде то что просил...

http://alexei-s1.narod.ru/Sheduler.rar




--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
h2o
Дата 1.12.2005, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 19.8.2005

Репутация: 1
Всего: 1



alexeis1 ругается на RecodeMilliSecond(tt, 0);
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
Alexeis
Дата 1.12.2005, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



h2o на остальные не ругается?
(не могу сам проверить на работе нет палитры Samples)


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
h2o
Дата 1.12.2005, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 19.8.2005

Репутация: 1
Всего: 1



вообщем, когда указываю все настройки, указываю ехе, нажимаю ОК, он говорит "invalid float point" и показывает в Delphi на эту строку, я может неправильно ввожу что?
Добавлено @ 11:38
и это происходит токо когда ехе указываю. у меня в поле едит ничё не выводится...
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0942 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.