Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Завершение процессов


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()


Наверх

Титульная страница Поиск, карта сайта Написать письмо