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

Поиск:

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


Бывалый
*


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

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



Я вообще не понимаю принципа построения планировщика! есть форма, в которой условия планировщика. Всё работает по таймеру. От потока отказался, т.к. надоели ошибки разные и непонятные, которых нет в таймере.

Непонятно, как мне сделать расписание, тоесть по расписанию запускать мою процедуру:
1. ежедневно - DateTimePicker1
2. раз в неделю в определённый день и время - DateTimePicker2
3. раз в месяц в определенный день и время - DateTimePicker3

При запуске проги запускается таймер и он должен проверять время и при достижении нужного запустить мою процедуру. Я НЕ ПОНИМАЮ как сделать условия!!!
Процедура таймера
Код

procedure TSettingsMenu.Timer1Timer(Sender: TObject);
const edtinterval= 24*60*60;
var NowDate, NowTime,ArcDate, ArcTime:TDateTime;
begin
    NowTime:=Now;
    EDayArc:=Now;
    if ((NowTime >= DateTimePicker1.Time)    and
        (LastArcTime < DateTimePicker1.Time)) and
        then
       begin
         LastArcTime := Now;   //глобальная переменная TDateTime
         ProcArchive;  //запуск моей процедуры
         sleep(edtinterval*1000); //ждать 24 часа
       end;


но это неправильно т.к sleep(edtinterval*1000); не должно быть! Нужно проверять условия так
если щас время = времени указанном в планировщике и сегодня ещё процедура не зарускалась, то запустить мою процедуру, потом подождать до завтра 24 часа и опять запустить процедуру мою и так всё время.
А вот как такое реализовать я не понимаю.

ЭТО только 1 пример! а мне надо 3 условия реализовать:
1. ежедневно - DateTimePicker1
2. раз в неделю в определённый день и время - DateTimePicker2
3. раз в месяц в определенный день и время - DateTimePicker3

Помогите!!! smile
З.Ы. smile
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
~FoX~
Дата 22.11.2005, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

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



А зачем вообще sleep(edtinterval*1000) ?
Можн так Timer1.Interval := (edtinterval*1000);
Можно проверять каждый тик таймера не насталоли время равное указанному в DateTimePicker1..2..3 etc. И если настало, то взводим программу и переставляем дату в пикерах на следующую.
Да вообще полно всего можно придумать.


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Alexeis
Дата 22.11.2005, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Неплохо бы вести лог событий которые были уже запущены.


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

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

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


Бывалый
*


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

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



ну я и говорю, сколько не пробовал, не получается!

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


Амеба
Group Icon


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

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



Вопрос состоит в том как реализовать
Цитата

если щас время = времени указанном в планировщике и сегодня ещё процедура не зарускалась, то запустить мою процедуру, потом подождать до завтра 24 часа и опять запустить процедуру мою и так всё время.
А вот как такое реализовать я не понимаю.
smile


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

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

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


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

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



Код

procedure TForm1.Timer1Timer(Sender: TObject);
var
  N: TDateTime;
begin
  n := Now;
  if n >= DateTimePicker1.DateTime then begin
    ShowMessage('Пора выполняться');
    DateTimePicker1.Date := Now + 1; //Плюс один день
  end;
end;

Ой, забыл таймер тикает раз в секунду.

Это сообщение отредактировал(а) ~FoX~ - 22.11.2005, 11:43


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Snowy
Дата 22.11.2005, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Цитата(h2o @ 22.11.2005, 10:45)
1. ежедневно - DateTimePicker1
2. раз в неделю в определённый день и время - DateTimePicker2
3. раз в месяц в определенный день и время - DateTimePicker3

А зачем изобретать велосипед?
CreateWaitableTimer
Устанавливаешь ему любой DateTime и говоришь "Повторять каждые N времени".

PM MAIL   Вверх
~FoX~
Дата 22.11.2005, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

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



Snowy
А вроде один фиг они оба WM_TIMER ловят?
Хотя я согласен это проще....

Это сообщение отредактировал(а) ~FoX~ - 22.11.2005, 11:54


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Albinos_x
Дата 22.11.2005, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


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

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



1. нужно иметь файл, где хранить данные о задании
Например в формате: ( время выполнения, тип выполнения(каждый день, еженедельно...), что делать)
2. желательно создать свою структуру данных, в которую передавать задания ожидающие выполнения
к примеру:
Код

type
TListRun = record
     lrRecBD : word;       // ссылка на задание
     lrTimeS : TDateTime;  // время старта
     end;

 TListRunEx = array of TListRun;

далее необходимо при загрузке создавать список (перебираешь все записи и смотришь время старта, если установленное время больше текущего, то добавляешь в список, а так же проверяешь остальные условия выполнялось не выполнялось, если раз в недёлю, то надо ли добавлять и т.д.)
Код

SetLength(ListRun,Length(ListRun)+1);
ListRun[Length(ListRun)].lrRecBD:=RecNo;    // ссылка на задание
ListRun[Length(ListRun)].lrTimeS:=stdS;      // где stdS время старта

желательно сделать отдельной функцией, т.к. при переходе на новые сутки, нужно будет перезаписывать этот список.
допустим будешь проверять задания каждую секунду, то надо запоминать предыдущую дату, и ставить условие : если предыдущая дата отличается от текущей, то перезаписать список. При проверке времени:
Код

if ListRun[Length(ListRun)].lrTimeS=time then ..

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

if TimetoStr(ListN[Length(ListRun)].lrTimeS)=Timetostr(time) then

ещё хочу отметить, что DateTimePicker1.date вернёт значение вместе со временем, поэтому для перестраховки желательно использовать так:
Trunc(DateTimePicker1.date)
то же и со временем:
frac(DateTimePicker1.Time)
Добавлено @ 12:12
да ещё, после выполнения необходима из списка удалять задание
приблизительно так:
Код

// функция удаления из массива данных
procedure DelMasItem(var ListDel:TListRunEx;index:word);
var ListD:TListRunEx;
    i,n:integer;
    by:word;
begin
i:=Length(ListDel);
if i>0 then
   begin
   ListDel[index].lrRecBD:=ListDel[i-1].lrRecBD;
   ListDel[index].lrTimeS:=ListDel[i-1].lrTimeS;
   SetLength(ListDel,i-1);
   end;
end;


ЗЫ: если есть ошибки или недочёты, прошу меня простить... когда писал очень спешил smile

Это сообщение отредактировал(а) Albinos_x - 22.11.2005, 12:14


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


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Цитата
А вроде один фиг они оба WM_TIMER ловят?

Нет, это не юзер-таймер, а таймер объект ядра.
У Рихтера подробно описана работа с ним.
На нем построен стандартный планировщик WinXP.
Кроме того, он может выводить комп из спящего режима.
PM MAIL   Вверх
h2o
Дата 22.11.2005, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Snowy @ 22.11.2005, 11:45)
CreateWaitableTimer
Впервые слышу. Буду пробовать!



Цитата
код Pascal/Delphi
Код

procedure TForm1.Timer1Timer(Sender: TObject);
var
  N: TDateTime;
begin
  n := Now;
  if n >= DateTimePicker1.DateTime then begin
    ShowMessage('Пора выполняться');
    DateTimePicker1.Date := Now + 1; //Плюс один день
  end;
end;


Ой, забыл таймер тикает раз в секунду.

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

Добавлено @ 13:04
Albinos_x принял к сведению! но у меня более тупо реализовано! хотя...
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
h2o
Дата 22.11.2005, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Snowy А где его создавать? Как с ним работать? когда включать/выключать? и т.д.?
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
Snowy
Дата 22.11.2005, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Цитата(h2o @ 22.11.2005, 13:18)
Snowy А где его создавать? Как с ним работать? когда включать/выключать? и т.д.?

Я же сказал - у Рихтера все подробно расписано.
Найди в инете книгу:
"Джефри Рихрер - Создание эффективных WIN32-приложений" в chm формате.
Не раз еще пригодится. Это Библия WinAPI программиста.
Про таймеры читай в главе 9.
PM MAIL   Вверх
FRAGNATIC
Дата 22.11.2005, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


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

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



ещё SetTimer мона =)
PM MAIL   Вверх
Albinos_x
Дата 22.11.2005, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


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

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



Код

 DateTimePicker1.Date:=date+1;

1 - одни сутки.
Цитата
Вот так:? DateTimePicker1.Date := Now + 24часа*60минут*60секунд

чтобы добавить время желательно использовать EncodeTime
пример:
Код

 Label1.caption:=datetimetostr(date+EncodeTime(1,0,0,0)*5+EncodeTime(0,1,0,0)*30+EncodeTime(0,0,1,0)*20;

где 5 -часы - 30 - минуты - 20 - секунды


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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