【问题标题】:Execute a process or Create a process and set time interval to closed it执行流程或创建流程并设置时间间隔以关闭它
【发布时间】:2014-01-02 03:14:34
【问题描述】:

我想在没有 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。

我们如何解决这个问题?

谢谢

【问题讨论】:

  • 没有进程的优雅终止。终止进程总是粗鲁的,而且带有极大的偏见。
  • 您最好的选择可能是将WM_CLOSEWM_QUIT 发布到该进程并希望它正确处理这些消息。检查这个:stackoverflow.com/questions/2055753/…
  • @MarkoPaunovic:但是,正在运行的应用程序没有 GUI,因此没有可以向其发布消息的窗口。
  • @RemyLebeau 取决于。 CMD.EXE 报告关闭窗口,每个控制台应用程序都应响应 Windows 关机/重启警报。因此,归结为受控应用程序是错误还是正确的问题
  • @XenKid 优雅终止涉及合作。其他进程为优雅终止提供什么机制?

标签: delphi winapi createprocess


【解决方案1】:

CreateProcess()THandle 返回到TProcessInformation 记录中的新进程。您可以将该句柄传递给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;

【讨论】:

  • 那么 CMD 有没有 GUI?它可以优雅地关闭。那么主要是 GUI 的 Windows 服务呢?
  • @Arioch'CMD有一个关闭按钮,但是使用它并不等同于优雅关闭,正在运行的程序被中止。 Windows 服务应该处理关闭命令并且可以正常停止。
  • Windows 服务由 SCM 控制。使用 SCM API,而不是 CreateProcess(),与服务交互。看StartService()ControlService()等相关函数。
  • @The_Fox 我问的不是运行程序,而是 CMD 本身。您可以运行 CMD 脚本,当您单击该按钮时,CMD 会优雅地要求取消脚本执行。此外,我认为 FAR 和 nFTP 等程序以及其他以控制台为目标的程序也会以适当的方式对关闭和关闭做出反应。
  • @RemyLebeau 在全球声称任何没有 GUI 的程序都不能正常关闭时,它有什么变化?这只是双方实施的沟通问题。 GUI 程序也可能是错误的,并且会像 text-UI 一样忽略关闭请求。但这并不意味着一般情况下不能正常关闭 GUI 程序,它只意味着一个特定的程序有问题。
猜你喜欢
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多