Страница 1 из 1
Как сделать два связанный запроса командной строки?
Добавлено: 28.09.2009 16:57:26
PapaNT
Суть задачи в следующем:
1. Пишу MyProgram (под Windows)
2. Есть Program1 и Program2
из MyProgram нужно запустить сперва Program1, а потом Program2. Program1 должна выполняться Она завершится после запуска Program2.
Нужно определить когда завершится Program1 для дальнейшего продолжения программы.
Как это сделать. Искал в TProcess, но, на сколько понял, там на сколько понял, такая конструкция не реализуется.
P.S. Если это примерно набросать на cmd, то получится что-то около того:
start Program1
call Program2
цикл проверки того, что Program1 завершилась
Re: Как сделать два связанный запроса командной строки?
Добавлено: 28.09.2009 17:16:12
Mr.Smart
start и
call - это команды интерпретатора cmd и не какого отношения к запуску процессов не имеют.
Для ожидания завершения процесса в свойствах
TProcess.Options добавить ключ
poWaitOnExit:
Код: Выделить всё
TProcess.Options:=TProcess.Options+[poWaitOnExit]
А если вы хотите пользоваться командами и интерпретатора командной строки необходимо добавлять следующее:
Хотя это вам не к чему т.к. первая команда
start запускает документ на выполнение если с ним ассоциирована программа,
а вторая
call - это запуск пакетного (.bat или .cmd) файла из другого пакетного файла

Re: Как сделать два связанный запроса командной строки?
Добавлено: 28.09.2009 17:40:58
PapaNT
Mr.Smart писал(а):start и
call - это команды интерпретатора cmd и не какого отношения к запуску процессов не имеют.
Для ожидания завершения процесса в свойствах
TProcess.Options добавить ключ
poWaitOnExit:
Код: Выделить всё
TProcess.Options:=TProcess.Options+[poWaitOnExit]
А если вы хотите пользоваться командами и интерпретатора командной строки необходимо добавлять следующее:
Хотя это вам не к чему т.к. первая команда
start запускает документ на выполнение если с ним ассоциирована программа,
а вторая
call - это запуск пакетного (.bat или .cmd) файла из другого пакетного файла

Суть-то в том, что мне нужно ждать сперва когда завершится Program2, а уже потом проверять, что Program1 завершилась. Т.е., для запуска Program1 я не буду использовать poWaitOnExit, но буду его использовать для Program2. Здесь мне понятно.
Но как проверить, что Program1 завершилась? Как можно реализовать этот цикл проверки?
Re: Как сделать два связанный запроса командной строки?
Добавлено: 28.09.2009 17:57:29
Mr.Smart
Что нибудь такого вида:
Код: Выделить всё
uses Windows;
...
var
P: THandle;
R : DWord;
begin
Process1.Execute; // Запускаем Program1
P:=Process1.Handle;
....
R:=WaitForSingleObject (P,Infinite);
if R<>WAIT_FAILED then // Завершился
Re: Как сделать два связанный запроса командной строки?
Добавлено: 29.09.2009 10:54:56
v-t-l
TProcess.WaitOnExit - не то?
Re: Как сделать два связанный запроса командной строки?
Добавлено: 29.09.2009 13:14:59
PapaNT
Заработал такой пример:
Код: Выделить всё
program launchprogram;
uses
Windows, Classes, SysUtils, Process;
var
Process1 ,
Process2 : TProcess;
r : DWord;
p : THandle;
begin
Process1 := TProcess.Create(nil);
Process2 := TProcess.Create(nil);
Process1.CommandLine := 'C:\WINDOWS\notepad.exe';
Process2.CommandLine := 'C:\Windows\system32\wordpad.exe';
Process2.Options := Process2.Options + [poWaitOnExit];
Writeln('Запуск Notepad');
Process1.Execute;
Writeln('Запуск Wordpad');
Process2.Execute;
Writeln('Обе программы запущены.');
p := Process1.Handle;
Writeln('Получен Handle для Notepad.');
r := WaitForSingleObject(P,Infinite);
writeln('Программа Notepad уже не работает.');
Process1.Free;
Process2.Free;
end.
В примере Mr.Smart от 28.09.2009 17:57:29 оказалась лишняя проверка. Конструкция
r := WaitForSingleObject(P,Infinite) ожидает завершения программы Notepad и дальнейшая проверка значения r уже теряет смысл.