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 xe android 更改ProgressBar1进度条颜色
delphi CopyFileProgressBar 拷贝文件显示进度条