Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Calcular tiempo restante

Estas en el tema de Calcular tiempo restante en el foro de Visual Basic clásico en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 28/03/2006, 22:25
 
Fecha de Ingreso: noviembre-2005
Mensajes: 43
Antigüedad: 19 años
Puntos: 0
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...)
  #2 (permalink)  
Antiguo 29/03/2006, 01:31
Avatar de [EX3]  
Fecha de Ingreso: marzo-2006
Ubicación: Fuenlabrada, Madrid
Mensajes: 203
Antigüedad: 18 años, 8 meses
Puntos: 1
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.

  #3 (permalink)  
Antiguo 29/03/2006, 07:09
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 7 meses
Puntos: 17
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:
       /\ s     s(5) - s(0) 
Vm = ------- = ------------
       /\ t       5s - 1s
Calculada la velocidad media, puedes saber el tiempo que tardará en "recorrer" cualquier cantidad con la misma fórmula:

Código:
        /\s
/\t = -------
        Vm
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:

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
  #4 (permalink)  
Antiguo 29/03/2006, 19:19
 
Fecha de Ingreso: noviembre-2005
Mensajes: 43
Antigüedad: 19 años
Puntos: 0
Cita:
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...
Cómo puedo determinar el tiempo que demora copiar en cada vuelta del bucle, si copio 1024 bytes por bucle.
  #5 (permalink)  
Antiguo 29/03/2006, 23:07
Avatar de [EX3]  
Fecha de Ingreso: marzo-2006
Ubicación: Fuenlabrada, Madrid
Mensajes: 203
Antigüedad: 18 años, 8 meses
Puntos: 1
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...
__________________
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.

Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:40.