Как сделать два связанный запроса командной строки?

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Ответить
PapaNT
постоялец
Сообщения: 167
Зарегистрирован: 11.09.2009 12:06:46
Откуда: Москва

Как сделать два связанный запроса командной строки?

Сообщение PapaNT »

Суть задачи в следующем:
1. Пишу MyProgram (под Windows)
2. Есть Program1 и Program2
из MyProgram нужно запустить сперва Program1, а потом Program2. Program1 должна выполняться Она завершится после запуска Program2.
Нужно определить когда завершится Program1 для дальнейшего продолжения программы.

Как это сделать. Искал в TProcess, но, на сколько понял, там на сколько понял, такая конструкция не реализуется.

P.S. Если это примерно набросать на cmd, то получится что-то около того:
start Program1
call Program2
цикл проверки того, что Program1 завершилась
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

start и call - это команды интерпретатора cmd и не какого отношения к запуску процессов не имеют.
Для ожидания завершения процесса в свойствах TProcess.Options добавить ключ poWaitOnExit:

Код: Выделить всё

TProcess.Options:=TProcess.Options+[poWaitOnExit]

А если вы хотите пользоваться командами и интерпретатора командной строки необходимо добавлять следующее:

Код: Выделить всё

cmd.exe /c start program1.exe

Хотя это вам не к чему т.к. первая команда start запускает документ на выполнение если с ним ассоциирована программа,
а вторая call - это запуск пакетного (.bat или .cmd) файла из другого пакетного файла :wink:
PapaNT
постоялец
Сообщения: 167
Зарегистрирован: 11.09.2009 12:06:46
Откуда: Москва

Сообщение PapaNT »

Mr.Smart писал(а):start и call - это команды интерпретатора cmd и не какого отношения к запуску процессов не имеют.
Для ожидания завершения процесса в свойствах TProcess.Options добавить ключ poWaitOnExit:

Код: Выделить всё

TProcess.Options:=TProcess.Options+[poWaitOnExit]

А если вы хотите пользоваться командами и интерпретатора командной строки необходимо добавлять следующее:

Код: Выделить всё

cmd.exe /c start program1.exe

Хотя это вам не к чему т.к. первая команда start запускает документ на выполнение если с ним ассоциирована программа,
а вторая call - это запуск пакетного (.bat или .cmd) файла из другого пакетного файла :wink:

Суть-то в том, что мне нужно ждать сперва когда завершится Program2, а уже потом проверять, что Program1 завершилась. Т.е., для запуска Program1 я не буду использовать poWaitOnExit, но буду его использовать для Program2. Здесь мне понятно.
Но как проверить, что Program1 завершилась? Как можно реализовать этот цикл проверки?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение 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 // Завершился
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

TProcess.WaitOnExit - не то?
PapaNT
постоялец
Сообщения: 167
Зарегистрирован: 11.09.2009 12:06:46
Откуда: Москва

Сообщение 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 уже теряет смысл.
Ответить