рассматриваю / отлаживаю создание копий приложения (имеется два варианта: "копия формы" и "создание отдельного процесса" - наш случай)
с "созданием копии" - все понятно/ожидаемо (работает, без вопросов).
напонятно "поведение/работы" кода по созданию "отдельного процесса" (точнее структура try-finally / Free )
"дочерний процесс"(*) - запускается и оба процесса работают независимо друг от друга.
можно отдельно закрыть "пораждаемый/родительский процесс", можно "дочерний/копию", т.е. все как доктор прописал и описано в хелп/вики.
(*) - процесс -> исходный бинарник, т.е. запускает еще одну купию бинарного-файла/самого себя (но, думаю, это не принципиально).
- Код: Выделить всё
procedure _run_exe();
var
prc : TProcess;
i : integer;
begin
prc := TProcess.Create(nil);
try
prc.Executable := exe_path+'/'+exe_fname;
prc.InheritHandles := False;
prc.ShowWindow := swoShow;
prc.Options := [poDetached];
for i := 1 to GetEnvironmentVariableCount do
prc.Environment.Add(GetEnvironmentString(i));
prc.Execute;
finally
prc.Free;
end; // try-finally()
end;
итак, не понятно, с точки зрения кода C/C++ - работа/"ход мыслей" структуры:
- Код: Выделить всё
finally prc.Free;
код с осовобождением (prc.Free) должен сработать сразу после создания/запуска процесса, тем более при закрытии "родительского" процесса. (мы-же рассматриваем этот код из "родительско-запускаемого" процесса, а если родитель закрывается, то, данный код однозначно "должен сработать" и удалить поражденный процесс, но этого не происходит :о) - а работает все как "надо".
при чем - отладчик, и в самом деле, сразу после prc.Execute стопарИтся на данной команде, но !!! не входит внутрь prc.Free (игнорируется?!) и далее выходит из процедуры.
ВОПРОС: пожалуйста, поясните / разложите по полочкам "философию паскаля" в данном случае. можно оперировать понятиями ООП в контексте с/с++ (для более внятного пояснения :о)
п.с. пример кода
https://wiki.freepascal.org/Executing_E ... rograms/ru
Запуск отдельной программы
исходные данные
- Код: Выделить всё
slackware 14.2 / 15.0 / x64
fpc-3.2.2
lazarus_2.2.6 gtk2/qt4/qt5
lazarus_3.2.0 gtk2/qt4
debug-backend: fpDebug