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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Планировщик заданий, програмное управление 
V
    Опции темы
Snowy
Дата 28.8.2006, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Написал класс, управляющий встроенным Планировщиком Windows.
Просьба протестировать.
Возможности:
- добавление заданий
- удаление заданий
- список существующих заданий
- список периодов срабатывания задания
- добавление периодов срабатывания
- изменение параметров "путь, комментарий и т.д."
В аттаче модули и пример.

Не смог победить проблему с повторным запуском.
Точнее вроде работает, но максимальный период 9999 минут.
Может у кого будут какие идеи, как можно правильно настроить повтор.
Без указания конечной даты будет запускаться ежедневно в указанное время.
Также есть хитрый флаг TriggerType. Он работает по умолчанию, но можно сменить его на:
TASK_EVENT_TRIGGER_AT_SYSTEMSTART - запускать таск при старте системы
TASK_EVENT_TRIGGER_AT_LOGON - запускать при логоне

Добавлено @ 17:34 
ЗЫ. Еженедельный, ежемесячный и ежегодный запуск не реализовывал - ИМХО не нужны они для программного управления.

Присоединённый файл ( Кол-во скачиваний: 296 )
Присоединённый файл  TaskSchedulerManager.zip 10,65 Kb
PM MAIL   Вверх
drkot
Дата 28.8.2006, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


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

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



Неплохо. 
Цитата(Snowy @  28.8.2006,  17:32 Найти цитируемый пост)
Не смог победить проблему с повторным запуском.Точнее вроде работает, но максимальный период 9999 минут.

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

ЗЫЖ я всетаки к сторонним планировщикам склоняюсь (у встроеного зачастую гибкости нехватает).


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Snowy
Дата 28.8.2006, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Не спорю. Зато стандартный гарантировано уже есть у пользователя.
Я знаю, что можно задавать в часах. Но эта сволочь никак не хочет на них реагировать.
Я и минуты методом тыка хрен знает за сколько заставил работать.
8 раз этот раздел MSDN'a перечитал. Там всё слишком кратко. А начинаешь делать - не слушается smile
Но более-менее нормальный функционал получился.
PM MAIL   Вверх
Elfebet
Дата 28.8.2006, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я так думаю задавать периодичность по минутам - это не правильно. Стандартном планировщике периодичность задается в: днях, неделях, месяцах и однократно. Т.е. нужно как-то явно указывать планировщику что выполнение будет каждые 3 дня и т.п. так что здесь эти 4 вида периодичности играют важную роль.


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
drkot
Дата 28.8.2006, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


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

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



Цитата(Snowy @  28.8.2006,  17:49 Найти цитируемый пост)
Там всё слишком кратко

как впрочем и весь МСДН.  smile 
Написано красиво, а работать в лучшем случае в 2 ночи начинает кошда по три спички в глазах.  smile 
Цитата(Snowy @  28.8.2006,  17:49 Найти цитируемый пост)
Зато стандартный гарантировано уже есть у пользователя.

Согласен. для внедрения в свое ПО вещь "золотая". (после установки системы ету службу сразу отключаю тк практически не пользуюсь)

Добавлено @ 18:01 
Цитата(Elfebet @  28.8.2006,  17:59 Найти цитируемый пост)
Я так думаю задавать периодичность по минутам - это не правильно. 

не ты неправильно понял, есть возможность задать произвольный интервал повлорения (например каждые 5 минут)

Добавлено @ 18:03 
Цитата(Snowy @  28.8.2006,  17:49 Найти цитируемый пост)
Я знаю, что можно задавать в часах. Но эта сволочь никак не хочет на них реагировать.

посмотрю может чего накопаю.


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Elfebet
Дата 28.8.2006, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вот что я нашел в файле mstask.pas:
Код

type
  PTaskTriggerType = ^TTaskTriggerType;
  _TASK_TRIGGER_TYPE = (
    TASK_TIME_TRIGGER_ONCE,
    TASK_TIME_TRIGGER_DAILY,
    TASK_TIME_TRIGGER_WEEKLY,
    TASK_TIME_TRIGGER_MONTHLYDATE,
    TASK_TIME_TRIGGER_MONTHLYDOW,
    TASK_EVENT_TRIGGER_ON_IDLE,
    TASK_EVENT_TRIGGER_AT_SYSTEMSTART,
    TASK_EVENT_TRIGGER_AT_LOGON,
    TASK_TRIGGER_TYPE);

наверное соответсвенно и выставляется число от 0 - 9999. Т.е. наверное если:
TASK_TIME_TRIGGER_DAILY, то от 1 до 31
TASK_TIME_TRIGGER_WEEKLY, то от 1 до 52
тока вот не понял TASK_TIME_TRIGGER_MONTHLYDATE и  TASK_TIME_TRIGGER_MONTHLYDOW....
сто пудова от 0-9999 - может быть не только минуты...


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
Snowy
Дата 28.8.2006, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ну там далеко не так всё просто.
Я попозже сделаю перегруженные функции для добавления других вариантом.
Сейчас вариантов два: Задавать период в минутах, либо ежедневный запуск.
Но можно сделать настройку интервала в днях. Можно и по дням недели. Можно и по дням месяца.
Год, пожалуй делать уже не буду. Хотя в принципе можно. Посмотрим.
С периодом проблем нет. Проблемы с повторением.

Цитата(Elfebet @  28.8.2006,  17:59 Найти цитируемый пост)
Стандартном планировщике периодичность задается в: днях, неделях, месяцах и однократно.
Угу. Это всё ясно. Просто у однократного запуска есть ещё такой параметр - повторять N-ый период.
PM MAIL   Вверх
Elfebet
Дата 29.8.2006, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Snowy, прошу помоги разобраться как это выставлять период. что у меня ничего не получается. (ну к примеру выставить Ежемесячно, с расписанием по месяцам и выбор месяцов). ну прям горит smile 


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
Snowy
Дата 29.8.2006, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Пока никак. Нужно доработать такие возможности.
Если хочешь сам попробовать, то дорога тебе в MSDN.
Но не думаю, что разберёшься - тап придумано, как обычно через заднюю ногу.
PM MAIL   Вверх
Elfebet
Дата 30.8.2006, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Но не думаю, что разберёшься - тап придумано, как обычно через заднюю ногу. 

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

procedure TForm1.Button1Click(Sender: TObject);
var WorkItem, PITask: IUnknown;
    piNewTrigger, tWord: Word;
    ITTrigger: ITaskTrigger;
    TaskTrig: TTaskTRIGGER;
    uname, pass: PWideChar;
begin
tWord:=0;
if Trim(Edit3.Text)='' then begin ShowMessage('Не задано "Имя задания"'); Exit; end;
if Trim(Edit1.Text)='' then begin ShowMessage('Не задано "Запуск прораммы"'); Exit; end;
  // проверяем если задание с таким именем существует тогда удаляем
  Task := nil;
  if SchedulingAgent.Activate(StrToWide(Edit3.Text), IID_ITask, PITask) = S_OK then Task := ITask(PITask);
  if Task <> nil then SchedulingAgent.Delete(StrToWide(Edit3.Text));
  // заносим имя задания
  SchedulingAgent.NewWorkItem(StrToWide(Edit3.Text), CLSID_CTask, IID_IScheduledWorkItem, WorkItem);
  Task := ITask(WorkItem);
  ScheduledWorkItem := IScheduledWorkItem(WorkItem);
  // запуск программы
  Task.SetApplicationName(StrToWide(Edit1.Text));
  // параметры запуска программы
  Task.SetParameters(StrToWide(Edit2.Text));
  // рабочая директория
  Task.SetWorkingDirectory(StrToWide(ExtractFileDir(Edit1.Text)));
  // комментарии
  Task.SetComment(StrToWide(mComment.Text));
  // устанавливаем акаунт юзера (имя, пароль пользователя)
  GetMem(uname, 255);
  GetMem(pass, 255);
  StringToWideChar(edName.Text, uname, Length(edName.Text) + 1);
  StringToWideChar(edPass.Text, pass, Length(edPass.Text) + 1);
  Task.SetAccountInformation(uname, pass);
  FreeMem(uname);
  FreeMem(pass);
  // устанавливаем с какой даты выполнять задание
  Task.CreateTrigger(piNewTrigger, ITTrigger);
  ZeroMemory(@TaskTrig, sizeof(TASK_TRIGGER));
  TaskTrig.cbTriggerSize := sizeof(TASK_TRIGGER);
  TaskTrig.wBeginYear := YearOf(dtDate.Date);
  TaskTrig.wBeginMonth := MonthOf(dtDate.Date);
  TaskTrig.wBeginDay := DayOf(dtDate.Date);
  TaskTrig.wEndYear := 0;
  TaskTrig.wEndMonth := 0;
  TaskTrig.wEndDay := 0;
  // время запуска
  TaskTrig.wStartHour := HourOf(dtTime.Time);
  TaskTrig.wStartMinute := MinuteOf(dtTime.Time);
  // тип запуска
  case ComboBox1.ItemIndex of
    0: begin // если ежедневно
         TaskTrig.TriggerType:=TASK_TIME_TRIGGER_DAILY;
         TaskTrig.Type_.Daily.DaysInterval:=StrToInt(SpinEdit1.Text);
       end;
    1: begin // если еженедельно
         TaskTrig.TriggerType:=TASK_TIME_TRIGGER_WEEKLY;
         TaskTrig.Type_.Weekly.WeeksInterval:=StrToInt(SpinEdit2.Text);
         if chkW1.Checked then tWord:=tWord+TASK_MONDAY;
         if chkW2.Checked then tWord:=tWord+TASK_TUESDAY;
         if chkW3.Checked then tWord:=tWord+TASK_WEDNESDAY;
         if chkW4.Checked then tWord:=tWord+TASK_THURSDAY;
         if chkW5.Checked then tWord:=tWord+TASK_FRIDAY;
         if chkW6.Checked then tWord:=tWord+TASK_SATURDAY;
         if chkW7.Checked then tWord:=tWord+TASK_SUNDAY;
         TaskTrig.Type_.Weekly.rgfDaysOfTheWeek:=tWord;
       end;
    2: begin // если ежемесячно
         if chkMonth1.Checked then tWord:=tWord+TASK_JANUARY;
         if chkMonth2.Checked then tWord:=tWord+TASK_FEBRUARY;
         if chkMonth3.Checked then tWord:=tWord+TASK_MARCH;
         if chkMonth4.Checked then tWord:=tWord+TASK_APRIL;
         if chkMonth5.Checked then tWord:=tWord+TASK_MAY;
         if chkMonth6.Checked then tWord:=tWord+TASK_JUNE;
         if chkMonth7.Checked then tWord:=tWord+TASK_JULY;
         if chkMonth8.Checked then tWord:=tWord+TASK_AUGUST;
         if chkMonth9.Checked then tWord:=tWord+TASK_SEPTEMBER;
         if chkMonth10.Checked then tWord:=tWord+TASK_OCTOBER;
         if chkMonth11.Checked then tWord:=tWord+TASK_NOVEMBER;
         if chkMonth12.Checked then tWord:=tWord+TASK_DECEMBER;
         if RadioButton1.Checked then begin
           TaskTrig.TriggerType:=TASK_TIME_TRIGGER_MONTHLYDATE;
           TaskTrig.Type_.MonthlyDate.rgfDays:=humanDaysToBitField(StrToInt(SpinEdit3.Text));
           TaskTrig.Type_.MonthlyDate.rgfMonths:=tWord;
         end else begin
           TaskTrig.TriggerType:=TASK_TIME_TRIGGER_MONTHLYDOW;
           case ComboBox2.ItemIndex of
             0: TaskTrig.Type_.MonthlyDOW.wWhichWeek:=TASK_FIRST_WEEK;
             1: TaskTrig.Type_.MonthlyDOW.wWhichWeek:=TASK_SECOND_WEEK;
             2: TaskTrig.Type_.MonthlyDOW.wWhichWeek:=TASK_THIRD_WEEK;
             3: TaskTrig.Type_.MonthlyDOW.wWhichWeek:=TASK_FOURTH_WEEK;
             5: TaskTrig.Type_.MonthlyDOW.wWhichWeek:=TASK_LAST_WEEK;
           end;
           case ComboBox3.ItemIndex of
             0: TaskTrig.Type_.MonthlyDOW.rgfDaysOfTheWeek:=TASK_MONDAY;
             1: TaskTrig.Type_.MonthlyDOW.rgfDaysOfTheWeek:=TASK_TUESDAY;
             2: TaskTrig.Type_.MonthlyDOW.rgfDaysOfTheWeek:=TASK_WEDNESDAY;
             3: TaskTrig.Type_.MonthlyDOW.rgfDaysOfTheWeek:=TASK_THURSDAY;
             4: TaskTrig.Type_.MonthlyDOW.rgfDaysOfTheWeek:=TASK_FRIDAY;
             5: TaskTrig.Type_.MonthlyDOW.rgfDaysOfTheWeek:=TASK_SATURDAY;
             6: TaskTrig.Type_.MonthlyDOW.rgfDaysOfTheWeek:=TASK_SUNDAY;
           end;
           TaskTrig.Type_.MonthlyDOW.rgfMonths:=tWord;
         end;
       end;
     // иначе однократно
     else TaskTrig.TriggerType:=TASK_TIME_TRIGGER_ONCE;
  end;
  ITTrigger.SetTrigger(@TaskTrig);
  // сохраняем
  Task.QueryInterface(IID_IPersistFile, pIPersistFile);
  if pIPersistFile <> nil then pIPersistFile.Save(nil, true);
  // показываем список заданий
  Button3Click(self);
end;


И еще планировщик задания будет запускать задания если он конечно не отключен и нужно ставить обязательно имя и пароль пользователя, елси пароль пустой то задание не запуститься.

Snowy, спасибо за помощь!

Прошу оценить. smile 

Это сообщение отредактировал(а) Elfebet - 30.8.2006, 09:20

Присоединённый файл ( Кол-во скачиваний: 250 )
Присоединённый файл  Scheduler.zip 13,85 Kb


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
Snowy
Дата 30.8.2006, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ну надо же. И даже работает smile
Доработаю свой класс, если кому нужно будет.
Пока не нужно - не буду на это время тратить.
PM MAIL   Вверх
drkot
Дата 30.8.2006, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


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

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



Правилно. Главное принципы понять, чтоб когда понадобится парева меньше было.


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Snowy
Дата 30.8.2006, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



ХМ. Только щаз заметил, что у тебя расписание задаётся в момент создания.
А как же несколько расписаний?
Если так уж нужен ежемесячный запуск, то можно и моим классом создать 12 расписаний - по одному на каждый месяц smile
Хотя конечно по честному нужно делать полнофункционал...
Но лень smile
Полноценное управление и так есть - через стандартную управлялку шедулером.
А данная фень нужна только для автоматического создания задания. 
Например запускать себя автоматом по ночам.
PM MAIL   Вверх
Elfebet
Дата 30.8.2006, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Snowy, совершенно верно! Лень. И я не ставил задачу сделать несколько расписаний.

Добавлено @ 16:21 
ну если вдруг кому-то понадобится несколько расписаний, могу и доработать...


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
SamStone
Дата 3.10.2006, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Апну тему в надежде на ответ (и чего я ее на месяц раньше не нашел? smile )
У планировщика можно выставить крыжик чтобы уведомлять юзверя о пропущеных заданиях (комп был выключен и прочее). Можно ли вытащить пропущенные времена запуска или самому придется высчитывать?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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