Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2017.01.15;
Скачать: CL | DM;

Вниз

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

 
AlexeyTG   (2014-12-17 22:08) [0]

Всем привет! Сам не программист, давно ушел в другую сферу ИТ. Потребовалось написать программку, которая запускает одно приложение и по завершению его запускает второе. На данный момент сделал так
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


 
Ega23 ©   (2014-12-17 22:23) [1]

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


 
Ega23 ©   (2014-12-17 22:24) [2]

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


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

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

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


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

ShellExecuteEx


 
MBo ©   (2014-12-17 22:40) [5]

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


 
MBo ©   (2014-12-17 22:41) [6]

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


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

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


run-two-programs.bat


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

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


 
Ega23 ©   (2014-12-18 12:27) [9]


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


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


 
Dennis I. Komarov ©   (2014-12-18 15:03) [10]

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


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));


 
Кщд ©   (2014-12-18 15:15) [11]

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


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


> 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.
Для продолжения нажмите любую клавишу . . .


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

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


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

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


 
AlexeyTG   (2014-12-18 18:55) [15]

По данным примерам и рекомендациям написал рабочий код, просьба оценить "корявость" его и сделать замечания по улучшению.
http://delphimaster.net/view/2-1418918004/


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

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2017.01.15;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.022 c
15-1456494306
Rouse_
2016-02-26 16:45
2017.01.15
Нужна вычитка статьи


2-1395094367
Лакримакристи
2014-03-18 02:12
2017.01.15
Проверка наличия последнего слеша в пути к папке


15-1448185459
Limpo
2015-11-22 12:44
2017.01.15
Oracle хранимые процедуры


6-1256640553
Encore
2009-10-27 13:49
2017.01.15
Post/get неверная кодировка


15-1447436787
data
2015-11-13 20:46
2017.01.15
подскажите по my sql