我怎么能等到外部过程完成?

use*_*670 12 delphi winapi

所以我在Delphi中创建了一个表单,允许我运行各种配置的各种sikuli脚本.我现在正在做的是让使用该表单的人可以设置各种sikuli脚本以便一个接一个地运行.如:

第1步:使用ConfigFile1的SikuliScript1.第2步:使用ConfigFile2的SikuliScript2.等...这是我的代码到目前为止:

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;
Run Code Online (Sandbox Code Playgroud)

这非常有效,sikuli脚本运行完美,并且在运行时,cmd线可以看到正在执行的各种动作.sikuli脚本完成后,cmd行自行关闭.因此shell处理程序知道何时关闭正在运行的进程.所以我的问题是:是否有可能告诉delphi:在处理程序关闭进程后,运行下一个进程(Sikuli脚本)?现在我知道我可以在delphi中使用整个createProcess,但它似乎有点矫枉过正.必须有一种方法来更快更容易地做到这一点.有人有线索吗?

Bar*_*ijk 24

使用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;
Run Code Online (Sandbox Code Playgroud)


Dav*_*nan 6

您需要等到进程句柄发出信号.例如,通过调用WaitForSingleObject.显然,CreateProcess会返回一个您可以等待的进程句柄.你不能说服ShellExecute返回一个进程句柄,但它更有能力的兄弟ShellExecuteEx会这样做.

但是,我个人会在这里选择CreateProcess.您将获得更多的灵活性和控制力,而且并不复杂.例如,您可以根据需要禁止显示控制台窗口.