gpt4 book ai didi

delphi - 我怎样才能等到外部进程完成?

转载 作者:行者123 更新时间:2023-12-03 14:37:22 25 4
gpt4 key购买 nike

所以我在 Delphi 中制作了一个表单,允许我使用各种配置运行各种 sikuli 脚本。我现在所做的工作是让使用该表单的人能够设置各种 sikuli 脚本来依次运行。如:

第 1 步:SikuliScript1 和 ConfigFile1。步骤 2:带有 ConfigFile2 的 SikuliScript2。ETC...这是我到目前为止的代码:

procedure TSikRunForm.btnRunClick(Sender: TObject);
begin
DirCombo:= '/C '+DirSik+'\sikuli-script.cmd' +' -r ' + DirScript + ' --args '+DirConfig;
if SikFound then begin
ShellExecute(Handle, nil, 'cmd.exe', pChar(DirCombo), nil, SW_SHOWNORMAL);
Application.minimize;
end else begin
ShowMessage('Select the correct folder for your Sikuli installation folder');
end;
end;

这工作得很完美,sikuli 脚本运行完美,并且在运行时,cmd 行是可见的,并且显示正在执行的各种操作。 sikuli 脚本完成后,cmd 行会自行关闭。因此 shell 处理程序知道何时关闭正在运行的进程。所以我的问题是:是否可以告诉delphi:处理程序关闭进程后,运行下一个进程(Sikuli脚本)?现在我知道我可以在 delphi 中使用整个 createProcess ,但这似乎有点矫枉过正。必须有一种方法可以更快、更轻松地做到这一点。有人知道吗?

最佳答案

使用CreateProcess,您可以获得进程句柄,使用WaitForSingleObject,您可以检查进程何时完成。我使用以下函数,这在后台运行命令:

procedure ExecuteAndWait(const aCommando: string);
var
tmpStartupInfo: TStartupInfo;
tmpProcessInformation: TProcessInformation;
tmpProgram: String;
begin
tmpProgram := trim(aCommando);
FillChar(tmpStartupInfo, SizeOf(tmpStartupInfo), 0);
with tmpStartupInfo do
begin
cb := SizeOf(TStartupInfo);
wShowWindow := SW_HIDE;
end;

if CreateProcess(nil, pchar(tmpProgram), nil, nil, true, CREATE_NO_WINDOW,
nil, nil, tmpStartupInfo, tmpProcessInformation) then
begin
// loop every 10 ms
while WaitForSingleObject(tmpProcessInformation.hProcess, 10) > 0 do
begin
Application.ProcessMessages;
end;
CloseHandle(tmpProcessInformation.hProcess);
CloseHandle(tmpProcessInformation.hThread);
end
else
begin
RaiseLastOSError;
end;
end;

关于delphi - 我怎样才能等到外部进程完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17336227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com