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

时间:2014-08-08 18:24:24

标签: delphi progress-bar createprocess

我有一个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;

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

从评论中判断,您正在寻找一个选框进度条。将进度条的Style属性设置为pbstMarquee。通过连续不断地滑动指示器来显示选取进度。

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