为什么使用进度条来显示迭代的进度会大大增加所讨论的过程的执行时间?考虑到以下例子:
procedure FileToStringList(FileName: String);
var
fileSource: TStringList;
I: Integer;
begin
fileSource:= TStringList.Create;
try
fileSource.LoadFromFile(FileName);
for I := 0 to fileSource.Count - 1 do
begin
//Code....
end;
finally
fileSource.Free;
end;
end;如果添加进度条的更新:
procedure FileToStringList(FileName: String);
var
fileSource: TStringList;
I: Integer;
begin
fileSource:= TStringList.Create;
try
fileSource.LoadFromFile(FileName);
ProgressBar.Properties.Max:= fileSource.Count;
for I := 0 to fileSource.Count - 1 do
begin
Application.ProcessMessages;
ProgressBar.Position:= I;
end;
finally
fileSource.Free;
end;
end;执行迭代过程所需的时间会成倍增加。
执行200,000行文件的读取测试,而不更新进度条,迭代的时间大约为8秒,但是,如果激活进度条的更新以显示迭代的进度,此过程需要几分钟。
一个带有2700行文件的测试,正常时间是2-4秒,但是使用进度条,执行时间超过1分钟。
有人能指出应用程序ProcessMessages的使用是否不正确吗?如果例程在一个单元中或在与进度条相同的形式上,则结果不会改变。
好的,我可以看到评论,但是,有人能用一个例子或链接来指出在这些条件下更新进度条的正确方法吗?
发布于 2018-03-02 12:09:16
如果应用程序只转换输入文件,那么就不需要特殊的线程,您可以使用以下代码。
如果应用程序允许用户在处理文件时执行其他操作,则应该使用后台线程。
procedure FileToStringList(FileName: String);
var
fileSource: TStringList;
I,J: Integer;
begin
fileSource:= TStringList.Create;
try
fileSource.LoadFromFile(FileName);
ProgressBar.Properties.Max:= fileSource.Count;
J:=10;//TODO make it better
for I := 0 to fileSource.Count - 1 do
begin
if (I mod J = 0) then
begin
Application.ProcessMessages;
ProgressBar.Position:= I;
end;
end;
ProgressBar.Position:= fileSource.Count;
finally
fileSource.Free;
end;
end;或者你可以按时打电话给你的processMessages:
procedure FileToStringList(FileName: String);
var
fileSource: TStringList;
I,J: Integer;
lastCheck: TDateTime;
begin
fileSource:= TStringList.Create;
try
fileSource.LoadFromFile(FileName);
ProgressBar.Properties.Max:= fileSource.Count;
J:=1000;//refresh in ms
lastCheck:=now;
for I := 0 to fileSource.Count - 1 do
begin
if (lastCheck+j)<now then
begin
lastCheck:=now;
Application.ProcessMessages;
ProgressBar.Position:= I;
end;
end;
ProgressBar.Position:= fileSource.Count;
finally
fileSource.Free;
end;
end;https://stackoverflow.com/questions/49068088
复制相似问题