monrus
Опытный
Offline
|
|
« : 17-03-2007 20:46 » |
|
Хочу создать прогу, которая бы в определенное время запускала и вырубала процессы. Отчего отталкиваться? Какие функции использовать?
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #1 : 17-03-2007 21:31 » |
|
По таймеру (достаточно раз в секунду) получать системное время и просматривать список задач для запуска и остановки (зачем?). Этого достаточно?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
monrus
Опытный
Offline
|
|
« Ответ #2 : 18-03-2007 04:34 » |
|
нет - а без таймера можно. Типа с помощью таких функций: Seep, WaitForSingleObject, WaitForMultipleObjects, MsgWaitForMultipleObjects
|
|
|
Записан
|
|
|
|
|
nikedeforest
|
|
« Ответ #4 : 18-03-2007 08:18 » |
|
Это типа идея такова, чтобы уложить поток спать на столько миллисекунд, сколько осталось до запуска " ближайшего" приложения. Так что ли? Ну в принципе должно быть по идеи экономнее.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
RXL
|
|
« Ответ #5 : 18-03-2007 11:56 » |
|
Я крайне сомневаюсь, что речь идет о миллисекундах при запуске обычных программ в не realtime ОС - достаточно грубо считать в секундах и таймер тут как вполне подойдет, т.к. точность не нужна. Ведь стартуемый процесс может запускаться не одну секунду: пока dll-ки подгрузятся, пока ОС посвопирует в свое удовольствие, пока еще чего там параллельное мешать будет...
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
nikedeforest
|
|
« Ответ #6 : 18-03-2007 12:13 » |
|
Нет, я имел ввиду, что посмотрели сколко сейчас время, посмотрели во сколько надо запустить что-то, вычислили разницу в миллисекундах (там наверное миллионы будут ) и на это время усыпили поток. Поток проснулся и сразу запустил, что надо ему было. Тем самым, поток не гоняется и не узнает время каждую секунду, а спит все это время. Хотя конечно такой метод меня смущает маестами. К примеру, если уложить комп в спящий режим.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
monrus
Опытный
Offline
|
|
« Ответ #7 : 18-03-2007 12:22 » |
|
Ладно - буду использовать таймер.
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #8 : 18-03-2007 12:26 » |
|
Типа уговорили
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
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
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #11 : 20-03-2007 15:22 » |
|
я вообще не понимаю, зачем изобретать велосипед. чем стандартный не устраивает? 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
Опытный
Offline
|
|
« Ответ #13 : 25-03-2007 15:27 » |
|
Ну а можно там выключать (убивать) текущие процессы?
|
|
|
Записан
|
|
|
|
DemonicAlligator
Гость
|
|
« Ответ #14 : 26-03-2007 13:33 » |
|
Тебе надо убивать конкретный процесс, изи запущенное задание шедулера? Во втором случае - TaskMgr.Tasks[ i ].Terminate остановит запущенное задание, в первом - надо пользоваться внешней утилитой, умеющей убивать процессы...
|
|
« Последнее редактирование: 27-03-2007 08:39 от Синий Аллигатор »
|
Записан
|
|
|
|
x77
Модератор
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
Опытный
Offline
|
|
« Ответ #17 : 27-03-2007 13:24 » |
|
Отлично
|
|
|
Записан
|
|
|
|
|