Суть задачи в следующем:
1. Пишу MyProgram (под Windows)
2. Есть Program1 и Program2
из MyProgram нужно запустить сперва Program1, а потом Program2. Program1 должна выполняться Она завершится после запуска Program2.
Нужно определить когда завершится Program1 для дальнейшего продолжения программы.
Как это сделать. Искал в TProcess, но, на сколько понял, там на сколько понял, такая конструкция не реализуется.
P.S. Если это примерно набросать на cmd, то получится что-то около того:
start Program1
call Program2
цикл проверки того, что Program1 завершилась
Как сделать два связанный запроса командной строки?
Модератор: Модераторы
start и call - это команды интерпретатора cmd и не какого отношения к запуску процессов не имеют.
Для ожидания завершения процесса в свойствах TProcess.Options добавить ключ poWaitOnExit:
А если вы хотите пользоваться командами и интерпретатора командной строки необходимо добавлять следующее:
Хотя это вам не к чему т.к. первая команда start запускает документ на выполнение если с ним ассоциирована программа,
а вторая call - это запуск пакетного (.bat или .cmd) файла из другого пакетного файла
Для ожидания завершения процесса в свойствах TProcess.Options добавить ключ poWaitOnExit:
Код: Выделить всё
TProcess.Options:=TProcess.Options+[poWaitOnExit]А если вы хотите пользоваться командами и интерпретатора командной строки необходимо добавлять следующее:
Код: Выделить всё
cmd.exe /c start program1.exeХотя это вам не к чему т.к. первая команда start запускает документ на выполнение если с ним ассоциирована программа,
а вторая call - это запуск пакетного (.bat или .cmd) файла из другого пакетного файла
Mr.Smart писал(а):start и call - это команды интерпретатора cmd и не какого отношения к запуску процессов не имеют.
Для ожидания завершения процесса в свойствах TProcess.Options добавить ключ poWaitOnExit:Код: Выделить всё
TProcess.Options:=TProcess.Options+[poWaitOnExit]
А если вы хотите пользоваться командами и интерпретатора командной строки необходимо добавлять следующее:Код: Выделить всё
cmd.exe /c start program1.exe
Хотя это вам не к чему т.к. первая команда start запускает документ на выполнение если с ним ассоциирована программа,
а вторая call - это запуск пакетного (.bat или .cmd) файла из другого пакетного файла
Суть-то в том, что мне нужно ждать сперва когда завершится Program2, а уже потом проверять, что Program1 завершилась. Т.е., для запуска Program1 я не буду использовать poWaitOnExit, но буду его использовать для Program2. Здесь мне понятно.
Но как проверить, что Program1 завершилась? Как можно реализовать этот цикл проверки?
Что нибудь такого вида:
Код: Выделить всё
uses Windows;
...
var
P: THandle;
R : DWord;
begin
Process1.Execute; // Запускаем Program1
P:=Process1.Handle;
....
R:=WaitForSingleObject (P,Infinite);
if R<>WAIT_FAILED then // Завершился
TProcess.WaitOnExit - не то?
Заработал такой пример:
В примере Mr.Smart от 28.09.2009 17:57:29 оказалась лишняя проверка. Конструкция r := WaitForSingleObject(P,Infinite) ожидает завершения программы Notepad и дальнейшая проверка значения r уже теряет смысл.
Код: Выделить всё
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 уже теряет смысл.
