私は何千ものファイルをダウンロードする長いループをしています。私は数時間かかる可能性があるので、残りの推定時間を表示したいと思います。しかし、私が書いたことで、私はミリ秒の平均値を得ます。平均ダウンロード時間をミリ秒からTDateTime
に変更するにはどうすればよいですか?私はLabel1.Caption
を設定するよどこミリ秒をTDateTimeに変換するにはどうすればよいですか?
参照してください:
procedure DoWork;
const
AVG_BASE = 20; //recent files to record for average, could be tweaked
var
Avg: TStringList; //for calculating average
X, Y: Integer; //loop iterators
TS, TE: DWORD; //tick counts
A: Integer; //for calculating average
begin
Avg:= TStringList.Create;
try
for X:= 0 to FilesToDownload.Count - 1 do begin //iterate through downloads
if FStopDownload then Break; //for cancelling
if Avg.Count >= AVG_BASE then //if list count is 20
Avg.Delete(0); //remove the oldest average
TS:= GetTickCount; //get time started
try
DownloadTheFile(X); //actual file download process
finally
TE:= GetTickCount - TS; //get time elapsed
end;
Avg.Add(IntToStr(TE)); //add download time to average list
A:= 0; //reset average to 0
for Y:= 0 to Avg.Count - 1 do //iterate through average list
A:= A + StrToIntDef(Avg[Y], 0); //add to total download time
A:= A div Avg.Count; //divide count to get average download time
Label1.Caption:= IntToStr(A); //<-- How to convert to TDateTime?
end;
finally
Avg.Free;
end;
end;
PSを - 私は私の文字列と確信しているので、私は、最後の20(またはAVG_BASE)のダウンロードの平均速度を計算する様々な方法に開いていますリストソリューションは最高ではありません。私はすべてのダウンロードに基づいてそれを計算したくないのですが、速度はその時間に変わるかもしれません。したがって、私はちょうどあなたが、あなたがconstructorに経過ティックを渡して新しいインスタンスを作成することができ、ここからあなたは日、時間を使うことができ、TTimeSpan
レコードを使用することができる代わりのTDateTimeの最後の20
1:
この
moving average
レコードを使用することを検討して、あなたの平均時間を得るために。一部のコンピュータでは、TStopWatchの基礎となるWin32 API関数が安定せず、正しく動作しないことが判明しました(Windows XP、ICH4/ICH5時代のチップセットを搭載した特定のIntel Pentium 4チップセット)。現代のハードウェア(Core2Duo以降)ではもう問題ではありませんが、...(正確にやろうとする)ミリ秒単位で時間を費やしています.Windows APIは、試してみると大きな悲しみを与えてくれました。 TStopWatchはGetTickCountよりもはるかに正確です!私は、 –+1確かに、もし私もファイルサイズを考慮に入れることができれば.......遠く異なる話........ –