| |||
Calcular tiempo restante Hola, alguien me puede dar una idea de como puedo predecir el tiempo restante al copiar un archivo o directorio de un lugar a otro algo parecido a Windows( quedan 3 minutos...) |
| ||||
Realizando la copia byte a byte de cada archivo y sabiendo el tamaño cada uno puedes medir el porcentaje restante de copia, y sabiendo cuanto tarda en copiarse cada byte en cada vuelta del bucle junto a la informacion mencionada antes podrias calcular el tiempo restante. Salu2...
__________________ Proyecto dx_lib32 (http://dxlib32.se32.com) Libreria DLL ActiveX para el desarollo de juegos y programas multimedia en Visual Basic 6.0 con la potencia de DirectX Dice un dicho que "el que calla otorga". En internet tenemos otro que dice "nunca alimentes a un troll" que viene a decir "dejale hablar solo que se ya se cansara de incordiar". Solo los necios creen tener la razon con la ultima palabra. |
| |||
Trata de verlo como un problema de física sencillo: Es un movimiento rectilíneo uniforme. Aplicas la definición de velocidad: la velocidad es la derivada del espacio (el tamaño del archivo) respecto del tiempo. Por tanto, teniendo dos valores espacio-temporales, uno en el primer segundo y otro en el 5º, por ejemplo, puedes hallar la media con:
Código:
Calculada la velocidad media, puedes saber el tiempo que tardará en "recorrer" cualquier cantidad con la misma fórmula:/\ s s(5) - s(0) Vm = ------- = ------------ /\ t 5s - 1s
Código:
Por ejemplo, si en el 1º segundo has copiado ya 100 bytes, y en el 6º has copiado 1100, y te faltan por copiar 10.000, la solución sería:/\s /\t = ------- Vm
Código:
/\ s s(6) - s(0) 1100b - 100b Vm = ------- = -------------- = ---------------- = 200 bytes/segundo /\ t 6s - 1s 5s /\s 10000b /\t = ------- = ----------- = 50 segundos restantes Vm 200b/s |
| |||
Cita: Cómo puedo determinar el tiempo que demora copiar en cada vuelta del bucle, si copio 1024 bytes por bucle.
Iniciado por [EX3] Realizando la copia byte a byte de cada archivo y sabiendo el tamaño cada uno puedes medir el porcentaje restante de copia, y sabiendo cuanto tarda en copiarse cada byte en cada vuelta del bucle junto a la informacion mencionada antes podrias calcular el tiempo restante. Salu2... |
| ||||
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:
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.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 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...
__________________ Proyecto dx_lib32 (http://dxlib32.se32.com) Libreria DLL ActiveX para el desarollo de juegos y programas multimedia en Visual Basic 6.0 con la potencia de DirectX Dice un dicho que "el que calla otorga". En internet tenemos otro que dice "nunca alimentes a un troll" que viene a decir "dejale hablar solo que se ya se cansara de incordiar". Solo los necios creen tener la razon con la ultima palabra. |