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

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

Запуск двух программ с ожиданием завершения


AlexeyTG ©   (2014-12-17 22:08:00) 

Всем привет! Сам не программист, давно ушел в другую сферу ИТ. Потребовалось написать программку, которая запускает одно приложение и по завершению его запускает второе. На данный момент сделал так
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
 System.SysUtils, shellapi;

begin
 try
 ShellExecute(0, 'open', 'C:\Prog1.exe', '/Param', nil, 0);
 Sleep(1000);
 ShellExecute(0, 'open', 'C:\Prog2.exe', '/Param', nil, 0);
   { TODO -oUser -cConsole Main : Insert code here }
 except
   on E: Exception do
     Writeln(E.ClassName, ': ', E.Message);
 end;
end.


Что само с собой очень коряво :(

Просьба выложите текст программки которая будет делать тоже самое, но ждать завершения prog1, и после уже запускать prog2


кгшзх   (2014-12-18 21:16:00) [1]

BATник не пойдет, нужен именно ЕХЕшник )

кому-то не подойдет, а кто-то не видит никакой разницы.
батник запустит точно такой же процесс как и твой exe.
после createprocess и завершения процесса все что тебе будет известно про него - это гетэкзитпроцесскоде.

который точно так же будет доступен и в батнике.


AlexeyTG   (2014-12-18 18:55:00) [2]

По данным примерам и рекомендациям написал рабочий код, просьба оценить "корявость" его и сделать замечания по улучшению.
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1418918004&n=18


AlexeyTG   (2014-12-18 16:53:00) [3]

MBo, Dennis I. KomarovВам отдельное спасибо за примеры :)


AlexeyTG   (2014-12-18 16:40:00) [4]

Ок. Всем ОГРОМНОЕ спасибо за ответы и примеры. Буду разбираться, пробовать по данным Вами рекомендациям.


Dennis I. Komarov   (2014-12-18 15:45:00) [5]


> AlexeyTG   (18.12.14 11:23) [8]
> кгшзх BATник не пойдет, нужен именно ЕХЕшник )


C:\Users\Денис>cmd.exe /?
Запуск новой копии интерпретатора команд Windows.

CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF]
   [[/S] [/C | /K] строка]

/C      Выполнение указанной команды (строки) с последующим завершением.
/K      Выполнение указанной команды (строки) без последующего завершения.
/S      Изменение поведения после /C или /K (см. ниже)
/Q      Отключение режима вывода команд на экран (ECHO).
/D      Отключение выполнения команд AutoRun из реестра (см. ниже)
/A      Вывод результатов выполнения команд в формате ANSI.
/U      Вывод результатов выполнения команд в формате UNICODE.
/T:fg    Выбор цвета переднего плана/фона (более подробно см. COLOR /?)
/E:ON   Разрешение расширенной обработки команд (см. ниже)
/E:OFF  Запрет расширенной обработки команд (см. ниже)
/F:ON   Разрешение символов завершения имен файлов и папок (см. ниже)
/F:OFF  Запрет символов завершения имен файлов и папок (см. ниже)
/V:ON   Разрешение отложенного расширения переменных среды с применением
       символа '!' в качестве разделителя. Например, /V:ON разрешает
       использовать !var! в качестве расширения переменной var во время
       выполнения. Синтаксис var служит для расширения переменных
       при вводе, что приводит к совсем другим результатам внутри
       цикла FOR.
Для продолжения нажмите любую клавишу . . .


Кщд   (2014-12-18 15:15:00) [6]

халявщиков-студентов отшиваете
а великовозрастных халявщиков - привечаете
чумачече)


Dennis I. Komarov   (2014-12-18 15:03:00) [7]

Вырезал кусок:


StartupInfo.cb := SizeOf(TStartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
StartupInfo.wShowWindow := SW_Show;
if CreateProcess(nil, PAnsiChar(ReadString('ARHIVE', 'Exec', '')), nil, nil, False, CREATE_NEW_CONSOLE OR NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then
 WaitForSingleObject(ProcessInfo.hProcess, INFINITE)
else ErrorList.Add(SysErrorMessage(GetLastError));


Ega23   (2014-12-18 12:27:00) [8]


> запуск с помощью CreateProcess (или ShellExecuteEx) даст
> дескриптор процесса, завершения которого можно подождать
> с помощью Wait** функций (ForSingleObject и т.д.)


Во, это ещё проще. "Слона-то я и не приметил".


AlexeyTG   (2014-12-18 11:23:00) [9]

кгшзхBATник не пойдет, нужен именно ЕХЕшник )


кгшзх   (2014-12-17 23:10:00) [10]

Потребовалось написать программку, которая запускает одно приложение и по завершению его запускает второе.


run-two-programs.bat


MBo   (2014-12-17 22:41:00) [11]

вот и в местном факе есть: http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=988621841&n=15


DVM   (2014-12-17 22:40:00) [12]

ShellExecuteEx


MBo   (2014-12-17 22:40:00) [13]

запуск с помощью CreateProcess (или ShellExecuteEx) даст дескриптор процесса, завершения которого можно подождать с помощью Wait** функций (ForSingleObject и т.д.)
В сети можно найти примеры с названиями вроде ExecuteAndWait (как обычно, половина примеров плохие)


AlexeyTG   (2014-12-17 22:37:00) [14]

С учетом того, что в последний раз Delphi открывал лет 10 назад, не осилю :( Читал про CreateProcess, WaitForSingleObject но как на готовом софте скомпилировать не знаю. RAD Studio скачал, поставил.

Поэтому прошу готовый исходник, чтобы только имя файла и ключ запуска изменить.
Как вариант запуск calc.exe, при его завершении (закрытие) запуск notepad.exe и закрытие написанной программы


Ega23   (2014-12-17 22:24:00) [15]

1.2.3 - это не шаги алгоритма, это возможные варианты решения, если чё. :)


Ega23   (2014-12-17 22:23:00) [16]

1. Первой программе передаются параметры запуска второй. перед окончанием своей работы первая сама запускает вторую.
2. Запускающая программа взводит именованный мьютекс и запускает первую программу, после чего уходит в цикл проверки взведённого мьютекса. Первая программа по завершении работы освобождает мьютекс. Запускающая программа выходит из цикла ожидания и запускает вторую программу.
3. Как-нибудь через это http://msdn.microsoft.com/en-us/library/windows/desktop/ms682489%28v=vs.85%29.aspxмониторим, кажется я что-то подобное лет 10 назад делал.


Наверх

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