Una idea asi de primeras seria que mediante la funcion del API de Windows
GetTickCount() guardaras el valor actual del reloj de la CPU, copiaras los 1024 bytes y despues restaras el valor anterior del reloj con el actual. Esto te devolveria los milisegundos que han pasado desde que inciastes la transferencia hasta terminarla. El problema que me encuentro por lo menos ahora haciendo una prueba rapida es que tal cantidad de bytes tarda mucho menos de un milisegundo con lo cual el calculo de tiempo estimado no seria posible al menos con este ejemplo:
Código:
Option Explicit
Const MaxTransfer = 1023
Const FileSize = 3756544 ' 3.58 mb
Private Declare Function GetTickCount Lib "kernel32.dll" () As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Private Sub Form_Load()
On Error Resume Next
Dim Buffer(FileSize) As Byte, Temp(MaxTransfer) As Byte
Dim Tick As Long, Transfer As Long, TickProc As Long
Dim i As Long
Me.AutoRedraw = True
Me.Show
Open App.Path & "\prueba.dat" For Binary Access Write As #1
TickProc = GetTickCount()
For i = 0 To UBound(Buffer) Step MaxTransfer
Tick = GetTickCount()
Call CopyMemory(Temp(0), Buffer(i), MaxTransfer)
Put #1, , Temp
Cls 'Limpiamos el formulario:
Print i & " bytes copiados de " & FileSize
'Calculamos el porcentaje restante de la transferencia de datos:
Print CInt(i / FileSize * 100) & "%"
'Mostramos el tiempo que tarda en copiar la cantidad definida por la constante MaxTransfer:
Print Transfer & " milisegundos por " & MaxTransfer & " bytes"
Print CInt((Transfer * FileSize) / MaxTransfer) & " tiempo estimado"
DoEvents
'Tiempo que tarda en dar una vuelta al bucle:
Transfer = GetTickCount() - Tick
Next i
Print "Tiempo total exacto: " & GetTickCount() - TickProc & " milisegundos"
Close #1
End Sub
El ejemplo simula una copia de un archivo mediante la copia de un array de bytes en porciones de 1024 bytes por vuelta de bucle a un archivo que crea el programa.
No he implementado nunca un calculo mas preciso de un milisegundo y tampoco recuerdo ahora mismo alguna funcion mas precisa que
GetTickCount(), que haberla la hay, asi que no sabria decirte de alguna forma de realizar el calculo en unidades menores.
Salu2...