执行进程或创建进程并设置关闭进程的时间间隔



我想执行一个没有 gui 窗口的参数应用程序,然后在 2 分钟内优雅地自动结束进程。

这是我使用代码的方式:

procedure ExecNoWait(Filename: string);
var
   bchExec: array[0..1024] of char;
   pchEXEC: Pchar;
   si: TStartupInfo;
   pi: TProcessInformation;
begin
   pchExec := @bchExec;
   StrPCopy(pchExec,Filename);
   FillChar(si,sizeof(si),0);
   FillChar(pi,sizeof(pi),0);
   si.dwFlags:=STARTF_USESHOWWINDOW;
   si.wShowWindow:=SW_HIDE;
   si.cb := sizeof(si);
   CreateProcess(Nil,pchExec,Nil,Nil,false,CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, Nil,Nil,si,pi);
end;

ExecNoWait(TheExeFilePath + 'ThisExe.exe -runnow'); //NON-GUI App

但是我想在 2 分钟内优雅地自动结束或自动关闭 ThisExe.exe。

我们如何解决这个问题?

谢谢

CreateProcess()返回TProcessInformation记录中新进程的THandle。 可以将该句柄传递给WaitForSingleObject(),超时时间为 2 分钟。如果超时过去,您可以将相同的句柄传递给TerminateProcess()(由于不涉及 GUI,因此没有"优雅"终止的选项),例如:

var
  bchExec: string;
  si: TStartupInfo;
  pi: TProcessInformation;
begin
  bchExec := Filename;
  UniqueString(bchExec);
  FillChar(si, sizeof(si), 0);
  FillChar(pi, sizeof(pi), 0);
  si.cb := sizeof(si);
  si.dwFlags := STARTF_USESHOWWINDOW;
  si.wShowWindow := SW_HIDE;
  if CreateProcess(nil, PChar(bchExec), nil, nil, false, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, si, pi) then
  begin
    CloseHandle(pi.hThread);
    if WaitForSingleObject(pi.hProcess, 120000) = WAIT_TIMEOUT then
      TerminateProcess(pi.hProcess, 666);
    CloseHandle(pi.hProcess);
  end;
end;

最新更新