我有一个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;
答案 0 :(得分:1)
“过程的进展”本身并没有固有的意义。进度条显示正是它被编程显示的内容,可能与实际表示程序中发生的任何事情的进展有关,也可能没有任何关系。首先,您需要定义“过程的进度”在此特定上下文中的含义。但是我们假设你已经做到了。
第二步是让您的流程将其进度传达回调用流程。你拥有第二个项目吗?你能不能写入标准输出(writeln
)?如果是这样,请查看this answer中列出的第二个示例,了解创建进程并使其读取进程输出的方法。然后你只需要子进程和父进程来理解它写入的输出的格式,并在每次子进行更新时相应地更新进度条。
如果没有,子进程是否已经以某种方式输出其进度?然后同样的原则适用,你只需要采用它使用的格式。如果没有,那么除非你能让作者将这个输出作为一个特征添加,否则你有点不走运。
答案 1 :(得分:0)
从评论中判断,您正在寻找一个选框进度条。将进度条的Style
属性设置为pbstMarquee
。通过连续不断地滑动指示器来显示选取进度。
您需要提取消息队列以使进度条动画保持活动状态。也许在一个单独的线程中运行CreateProcess
代码,并在完成后向主线程发出信号。或者使用基于MsgWaitForMultipleObjects
的等待,允许您等待并为队列提供服务。