Estoy haciendo un ciclo largo descargando miles de archivos. Me gustaría mostrar un tiempo restante estimado, ya que podría llevar horas. Sin embargo, con lo que he escrito, obtengo un número promedio de milisegundos. ¿Cómo convierto este tiempo promedio de descarga de milisegundos a TDateTime
?¿Cómo convierto milisegundos a TDateTime?
ver donde estoy estableciendo Label1.Caption
:
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 - Estoy abierto a diferentes formas de calcular la velocidad media de los últimos 20 descargas (o AVG_BASE), porque estoy seguro de que mi cadena la lista de soluciones no es la mejor. No quiero calcularlo en base a todas las descargas, porque la velocidad puede cambiar durante ese tiempo. Por lo tanto, solo estoy verificando los últimos 20.
+1 para TStopWatch. Tenga en cuenta que en algunas computadoras, encontré que las funciones API de Win32 subyacentes de TStopWatch no eran estables y no funcionaban correctamente (Windows XP, en ciertos conjuntos de chips Intel Pentium 4 con conjuntos de chips de la era ICH4/ICH5). Ya no es un problema en el hardware moderno (Core2Duo y posterior), pero ... He pasado mucho tiempo midiendo milisegundos (tratando de hacerlo con precisión) y las API de Windows me han dado mucha pena por intentarlo. (No estoy diciendo que quiera un tiempo real difícil, solo un contador de milisegundos que no se congela ni se lanza hacia mí) - ¡TStopWatch es mucho más preciso que GetTickCount! –
+1 de hecho, ahora si solo pudiera tomar en consideración el tamaño de los archivos ....... aunque sea una historia diferente ........ –