![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Завершение процессов
Alexa © (2005-08-10 14:31:00)Уважаемые мастера! С WinAPI работаю совсем недавно. Возникло следующее затруднение: из моего приложения с помощью CreateProcess запускаю на выполение .bat файл, который в свою очередь тоже запускает некоторые программы (напр. rar). По истечение некоторого времени, если текущий процесс (исполняемый bat файл) незавершен, то он завершается с помощью terminateProcess. Но программы уже запущенные из бата своб работу не завершают. Вопрос такой: как можно было бы завершить их работу?
function RunCommandString(com:string; timeout:integer):integer;
var
si:STARTUPINFO;
pi:PROCESS_INFORMATION;
res: DWORD;
begin
ZeroMemory(@si,sizeof(si));
si.cb:=SizeOf(si);
if not CreateProcess( nil,
Pchar(com),
nil,
nil,
False,
0,
nil,
nil,
si,
pi)
then
begin
ShowMessage('CreateProcess failed.' );
Exit;
end;
res:=WaitForSingleObject( pi.hProcess, timeout); //Ожидание завершения процесса
if res = WAIT_TIMEOUT then //Если время процесса истекло
TerminateProcess(pi.hProcess,0); //то завершение процесса
result:=integer(res);
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
end;
Alexa (2005-08-11 12:20:00) [1]Большое всем спасибо за советы! все получилось!
alpet (2005-08-10 18:59:00) [2]в [5] указано нормальное решение.
В качестве альтернативы можешь написать отдельную утилиту для запуска процессов, и применять ее в .bat файле везде где выполняются другие процессы (т.е. подобие start.exe).
Отдельная утилита запускает на выполнение файл указанный к строке параметров (CreateProcess), и ждет либо его завершения, либо установления некоторого общего события (управляемого из программы запустившей .bat файл), с помощью функции WaitForMultipleObjects. Если в главной програме срабатывает таймаут, она устанавливает событие (SetEvent) в сигнальное состояние, после чего все утилиты, использующие это событие завершают запущенные ими процессы.
BiN (2005-08-10 16:01:00) [3]Игорь Шевченко © (10.08.05 15:39) [12]
<offtopic>
Эта..., спасибо, что ли... как-то неожиданно всё
</offtopic>
Игорь Шевченко (2005-08-10 15:39:00) [4]Leonid Troyanovsky © (10.08.05 15:30) [9]
BiN © (10.08.05 15:35) [11]
<offtopic>
Мои поздравления, мастера!
</offtopic>
BiN (2005-08-10 15:35:00) [5]Leonid Troyanovsky © (10.08.05 15:30) [9]
Для 16 битных.
вдогонку
Автор ветки, к сожалению, не указал, как именно он "запускает на выполнение" пакетные файлы. По умолчанию же для их открытия служит процесс, путь к образу которого прописан в %COMSPEC%.
Digitman (2005-08-10 15:32:00) [6]
> Leonid Troyanovsky © (10.08.05 15:30) [9]
rar.exe и есть, насколько я представляю, 16-битная ДОС-задача
Leonid Troyanovsky (2005-08-10 15:30:00) [7]
> Digitman © (10.08.05 15:25) [8]
>
> > В PROCESS_INFORMATION идентификатор какого процесса?
>
>
> под НТ - ntvdm.exe (виртуальная ДОС-машина НТ)
Для 16 битных.
--
Regards, LVT.
Digitman (2005-08-10 15:25:00) [8]
> В PROCESS_INFORMATION идентификатор какого процесса?
под НТ - ntvdm.exe (виртуальная ДОС-машина НТ)
каждый отдельно взятый пак.файл будет стартован и исполнен под управлением отдельного экземрпляра вирт.ДОС-машины
BiN (2005-08-10 15:18:00) [9]Digitman © (10.08.05 15:09) [6]
> процесс интерпретирующий целевой bat-файл
таких может быть великое множество
Разве?
автор пишет: " ...из моего приложения с помощью CreateProcess запускаю на выполение .bat файл, который в свою очередь тоже запускает некоторые программы (напр. rar)."
В PROCESS_INFORMATION идентификатор какого процесса?
Digitman (2005-08-10 15:09:00) [10]
> процесс интерпретирующий целевой bat-файл
таких может быть великое множество
BiN (2005-08-10 15:05:00) [11]С помощью Process32First/Next можно получить список процессов и вычленить те, создателем которых является процесс интерпретирующий целевой bat-файл.
Digitman (2005-08-10 14:55:00) [12]кроме как парсить bat-файл - никак.
мало ли кто, где и какие процессы стартовал в системе ..
Alexa (2005-08-10 14:51:00) [13]Некоторое уточнение: как же можно узнать имена стартованных процессов (если только не просматривать текст самого bat)?
Digitman (2005-08-10 14:36:00) [14]
> как можно было бы завершить их работу?
в общем случае - никак.
в частном же -зная имена стартованных пакетным заданием процессов завершить их точно так же (принудительно), с пом. TerminateThread
Lamer@fools.ua (2005-08-10 14:33:00) [15]> Вопрос такой: как можно было бы завершить их работу?
TerminateProcess()