Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как создать шедулер?  (Прочитано 21874 раз)
0 Пользователей и 1 Гость смотрят эту тему.
monrus
Опытный

ru
Offline Offline

« : 17-03-2007 20:46 » 

Хочу создать прогу, которая бы в определенное время запускала и вырубала процессы. Отчего отталкиваться? Какие функции использовать?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 17-03-2007 21:31 » 

По таймеру (достаточно раз в секунду) получать системное время и просматривать список задач для запуска и остановки (зачем?). Этого достаточно?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
monrus
Опытный

ru
Offline Offline

« Ответ #2 : 18-03-2007 04:34 » 

нет - а без таймера можно. Типа с помощью таких функций:
Seep, WaitForSingleObject, WaitForMultipleObjects, MsgWaitForMultipleObjects   
Записан
monrus
Опытный

ru
Offline Offline

« Ответ #3 : 18-03-2007 04:38 » 

мне почему-то кажется, что программы типа планировщиков не используют таймер. Хотя может я и не прав. Улыбаюсь
Записан
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 18-03-2007 08:18 » 

Это типа идея такова, чтобы уложить поток спать на столько миллисекунд, сколько осталось до запуска " ближайшего" приложения. Так что ли? Ну в принципе должно быть по идеи экономнее.
Записан

ещё один вопрос ...
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 18-03-2007 11:56 » 

Я крайне сомневаюсь, что речь идет о миллисекундах при запуске обычных программ в не realtime ОС - достаточно грубо считать в секундах и таймер тут как вполне подойдет, т.к. точность не нужна. Ведь стартуемый процесс может запускаться не одну секунду: пока dll-ки подгрузятся, пока ОС посвопирует в свое удовольствие, пока еще чего там параллельное мешать будет...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 18-03-2007 12:13 » 

Нет, я имел ввиду, что посмотрели сколко сейчас время, посмотрели во сколько надо запустить что-то, вычислили разницу в миллисекундах (там наверное миллионы будут Улыбаюсь ) и на это время усыпили поток. Поток проснулся и сразу запустил, что надо ему было. Тем самым, поток не гоняется и не узнает время каждую секунду, а спит все это время. Хотя конечно такой метод меня смущает маестами. К примеру, если уложить комп в спящий режим.
Записан

ещё один вопрос ...
monrus
Опытный

ru
Offline Offline

« Ответ #7 : 18-03-2007 12:22 » 

Ладно - буду использовать таймер.
Записан
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 18-03-2007 12:26 » 

Типа уговорили Улыбаюсь
Записан

ещё один вопрос ...
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #9 : 18-03-2007 20:28 » 

Хм - а в какой ОС? Хотя Дельфи используется только в винде...
Для создания нормального планировщика событий надо оценить необходимую точность.
Любой планировщик для людей вполне может пользоваться стандартным таймером.
Если же необходима точность до миллисекунд то:
1. На юзер моде в виндовс невозможно, так как планировщик ОК не гарантирует работу задачи нужное колличество времени.
2. В кернел моде используй внутренний system clock

3. Фуникции указанные тобой используют не для временной задержки, а для синхронизации на событиях....
Точность временных параметров у них довольно низкая и они построены на таймерных event-ах.
« Последнее редактирование: 18-03-2007 20:32 от Гром » Записан

А птичку нашу прошу не обижать!!!
DemonicAlligator
Гость
« Ответ #10 : 20-03-2007 08:14 » 

Не надо изобретать велосипед. В JCL/JVCL всё уже есть Улыбаюсь
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #11 : 20-03-2007 15:22 » new

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

Task Scheduler'ом самой винды, при желании, можно управлять. даже с командной строки из обычного бат-файла. синтаксис WSF достаточно могуч сам по себе, но при желании можно создавать собственные скриптовые бат-файлы (поддержка CScript и WScript во всех виндах начиная с XP встроена).

т.е. задача сведётся к тому, чтобы программно создать wsf-файл, и сказать штатному шедулеру, что этот файл надо зохавать. и всё.

только не говорите мне, что Task Scheduler слишком убогий Улыбаюсь он умеет практически всё. от вывода всех текущих задач в XML-формате до каких угодно настроек времени и условий выполнения. если же чего-то таки не хватает, опять таки, можно шедулить не сам экзешник (процесс), а запускающий его скрипт, в котором можно наворотить вообще всё, что угодно.
Записан

DemonicAlligator
Гость
« Ответ #12 : 21-03-2007 12:32 » 

Вот пример использования JCL Улыбаюсь

Код:
Program TaskTest;
{$APPTYPE CONSOLE}

Uses
   SysUtils, JclTask, ActiveX;

Function GetTasks:String;
Var
     TaskMgr:TJclTaskSchedule;
     i:Integer;
Begin
     Result:='';
     CoInitialize(nil);
     Try
      Try
       TaskMgr:=TJclTaskSchedule.Create('');
       Try
        TaskMgr.Refresh;
        For i:=0 to TaskMgr.TaskCount-1 do
        Result:=Result+IntToStr(i)+' - '+
         TaskMgr.Tasks[i].TaskName+#13#10;
       Finally
        TaskMgr.Free;
       End;
      Except
       on E:Exception do
        Result:=Result+e.Message;
      End;
     Finally
      CoUnInitialize;
     End;
End;

Begin

  Writeln(GetTasks);

End;

« Последнее редактирование: 21-03-2007 12:35 от Синий Аллигатор » Записан
monrus
Опытный

ru
Offline Offline

« Ответ #13 : 25-03-2007 15:27 » 

Ну а можно там выключать (убивать) текущие процессы?
Записан
DemonicAlligator
Гость
« Ответ #14 : 26-03-2007 13:33 » 

Тебе надо убивать конкретный процесс, изи запущенное задание шедулера? Во втором случае - TaskMgr.Tasks[ i ].Terminate остановит запущенное задание, в первом - надо пользоваться внешней утилитой, умеющей убивать процессы...
« Последнее редактирование: 27-03-2007 08:39 от Синий Аллигатор » Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #15 : 26-03-2007 15:38 » 

ну, не совсем внешней. XP Pro SP2:

Цитата
TASKKILL [/S system [/U username [/P [password]]]]
         { [/FI filter] [/PID processid | /IM imagename] } [/F] [/T]

Description:
    This command line tool can be used to end one or more processes.
    Processes can be killed by the process id or image name.

Parameter List:
    /S    system           Specifies the remote system to connect to.

    /U    [domain\]user    Specifies the user context under which
                           the command should execute.

    /P    [password]       Specifies the password for the given
                           user context. Prompts for input if omitted.

    /F                     Specifies to forcefully terminate
                           process(es).

    /FI   filter           Displays a set of tasks that match a
                           given criteria specified by the filter.

    /PID  process id       Specifies the PID of the process that
                           has to be terminated.

    /IM   image name       Specifies the image name of the process
                           that has to be terminated. Wildcard '*'
                           can be used to specify all image names.

    /T                     Tree kill: terminates the specified process
                           and any child processes which were started by it.

    /?                     Displays this help/usage.

Filters:
    Filter Name   Valid Operators           Valid Value(s)
    -----------   ---------------           --------------
    STATUS        eq, ne                    RUNNING | NOT RESPONDING
    IMAGENAME     eq, ne                    Image name
    PID           eq, ne, gt, lt, ge, le    PID value
    SESSION       eq, ne, gt, lt, ge, le    Session number.
    CPUTIME       eq, ne, gt, lt, ge, le    CPU time in the format
                                            of hh:mm:ss.
                                            hh - hours,
                                            mm - minutes, ss - seconds
    MEMUSAGE      eq, ne, gt, lt, ge, le    Memory usage in KB
    USERNAME      eq, ne                    User name in [domain\]user
                                            format
    MODULES       eq, ne                    DLL name
    SERVICES      eq, ne                    Service name
    WINDOWTITLE   eq, ne                    Window title

NOTE: Wildcard '*' for the /IM switch is accepted only with filters.

NOTE: Termination of remote processes will always be done forcefully
      irrespective of whether /F option is specified or not.

Examples:
    TASKKILL /S system /F /IM notepad.exe /T
    TASKKILL /PID 1230 /PID 1241 /PID 1253 /T
    TASKKILL /F /IM notepad.exe /IM mspaint.exe
    TASKKILL /F /FI "PID ge 1000" /FI "WINDOWTITLE ne untitle*"
    TASKKILL /F /FI "USERNAME eq NT AUTHORITY\SYSTEM" /IM notepad.exe
    TASKKILL /S system /U domain\username /FI "USERNAME ne NT*" /IM *
    TASKKILL /S system /U username /P password /FI "IMAGENAME eq note*"
Записан

DemonicAlligator
Гость
« Ответ #16 : 27-03-2007 08:29 » 

По отношению к шедулеру - внешняя... но это уже детали...
Записан
monrus
Опытный

ru
Offline Offline

« Ответ #17 : 27-03-2007 13:24 » 

Отлично
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines