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

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

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

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

Сообщение PapaNT » 28.09.2009 16:57:26

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

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

P.S. Если это примерно набросать на cmd, то получится что-то около того:
start Program1
call Program2
цикл проверки того, что Program1 завершилась
PapaNT
постоялец
 
Сообщения: 167
Зарегистрирован: 11.09.2009 12:06:46
Откуда: Москва

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

Сообщение Mr.Smart » 28.09.2009 17:16:12

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

А если вы хотите пользоваться командами и интерпретатора командной строки необходимо добавлять следующее:
Код: Выделить всё
cmd.exe /c start program1.exe

Хотя это вам не к чему т.к. первая команда start запускает документ на выполнение если с ним ассоциирована программа,
а вторая call - это запуск пакетного (.bat или .cmd) файла из другого пакетного файла :wink:
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение PapaNT » 28.09.2009 17:40:58

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 завершилась? Как можно реализовать этот цикл проверки?
PapaNT
постоялец
 
Сообщения: 167
Зарегистрирован: 11.09.2009 12:06:46
Откуда: Москва

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

Сообщение Mr.Smart » 28.09.2009 17:57:29

Что нибудь такого вида:
Код: Выделить всё
uses Windows;
...
var
P: THandle;
R : DWord;
begin
  Process1.Execute; // Запускаем Program1
  P:=Process1.Handle;
....
  R:=WaitForSingleObject (P,Infinite);
  if R<>WAIT_FAILED then // Завершился
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение v-t-l » 29.09.2009 10:54:56

TProcess.WaitOnExit - не то?
v-t-l
энтузиаст
 
Сообщения: 733
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

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

Сообщение PapaNT » 29.09.2009 13:14:59

Заработал такой пример:

Код: Выделить всё
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 уже теряет смысл.
PapaNT
постоялец
 
Сообщения: 167
Зарегистрирован: 11.09.2009 12:06:46
Откуда: Москва


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18

Рейтинг@Mail.ru