Delphi:如何使用进度条显示 CreateProcess 的进度?

Posted

技术标签:

【中文标题】Delphi:如何使用进度条显示 CreateProcess 的进度?【英文标题】:Delphi: How to use a progressbar to display the progress of a CreateProcess? 【发布时间】:2014-08-08 18:24:23 【问题描述】:

我有一个 Startandwait 函数,它创建一个进程并等待结束。如何创建进度条来指示进程的进度?

function StartRAndWait (CommandLine : string) : Boolean;

var
  Proc_info: TProcessInformation;
  Startinfo: TStartupInfo;
  ExitCode: longword;
  CreateOK : Boolean;

begin

Result := False;

  FillChar(proc_info, sizeof (TProcessInformation), #0);
  FillChar(startinfo, sizeof (TStartupInfo), #0);
  Startinfo.cb := sizeof (TStartupInfo);
  Startinfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
  Startinfo.wShowWindow := SW_HIDE;

  CreateOK := CreateProcess(Nil, PChar('Program.exe ' + 'CMD  BATCH  ARQ.EXT  SampleOutput.txt'), nil,
  nil,False, CREATE_NEW_PROCESS_GROUP+NORMAL_PRIORITY_CLASS, nil,nil, StartInfo, proc_info);

  if (CreateOK) then
  begin
  WaitForSingleObject (proc_info.hProcess, INFINITE);
  GetExitCodeProcess(proc_info.hProcess, ExitCode);
  Result := True
  end;
  CloseHandle(proc_info.hThread);
  CloseHandle(proc_info.hProcess);

end;

【问题讨论】:

您想准确显示什么进度?进程没有自己的进度状态。如果您尝试显示衍生进程正在执行的操作的进度,则衍生进程必须通过 IPC 机制(例如管道)将该信息传达回您的主进程。 选框进度条是您需要的,除非您可以使用 ipc 获得有意义的进度测量。 为什么在 CreateProces 失败时调用 CloseHandle? @DavidHeffernan true 我会修复它。 我认为我表达得很糟糕,我实际上希望进度条根据进程进行的时间填充。所以当他完成时,酒吧很快就会填满。她不需要显示过程本身的确切进度,只显示正在发生的事情的用户,而不仅仅是鼠标指针。 【参考方案1】:

“过程的进展”本身并没有内在的意义。进度条准确地显示它被编程显示的内容,这可能与实际表示程序中发生的任何事情的进度有关,也可能没有任何关系。因此,首先您需要定义“过程的进展”在此特定上下文中的含义。但是让我们假设您已经这样做了。

第二步是让您的进程将其进度传达回调用进程。你拥有第二个程序吗?你能让它写入标准输出(writeln)吗?如果是这样,请查看this answer 中列出的第二个示例,了解创建进程并使其读取进程输出的方法。那么你只需要子进程和父进程都了解它写入的输出格式,并在每次子进程更新时相应地更新进度条。

如果没有,子进程是否已经以某种方式输出了它的进度?然后同样的原则适用,你只需要采用它使用的格式。如果没有,那么你就有点不走运了,除非你能让作者将此输出添加为一个特性。

【讨论】:

我编辑了我的代码。我有一个输出,我把它放在一个 txt 文件中。请看我上面的评论。但我认为您引用的昏迷答案(示例)可以解决我的问题。【参考方案2】:

从您正在寻找字幕进度条的 cmets 来看。将进度条的Style 属性设置为pbstMarquee。选取进度条通过不断地前后滑动指示器来显示进度。

您需要抽取消息队列以保持进度条动画处于活动状态。也许在单独的线程中运行CreateProcess 代码并在完成时向主线程发出信号。或者使用基于MsgWaitForMultipleObjects 的等待,允许您等待并为队列提供服务。

【讨论】:

真的CreateProcess锁了进度条的动画,我没绕过去。 CreateProcess 快速返回。您需要抽出队列。你是吗? 好的,我不明白'pump the queue'的意思,但我会搜索这个。谢谢。

以上是关于Delphi:如何使用进度条显示 CreateProcess 的进度?的主要内容,如果未能解决你的问题,请参考以下文章

Delphi下载指定网址(URL)的文件,带进度条显示

delphi xe android 更改ProgressBar1进度条颜色

delphi CopyFileProgressBar 拷贝文件显示进度条

为什么Delphi进度条会增加迭代过程的执行时间?

Delphi里ProgressBar在更新进度的时候,能够显现百分比吗?

delphi 渐变颜色进度条 控件