Ver Mensaje Individual
  #5 (permalink)  
Antiguo 29/03/2006, 23:07
Avatar de [EX3]
[EX3]
 
Fecha de Ingreso: marzo-2006
Ubicación: Fuenlabrada, Madrid
Mensajes: 203
Antigüedad: 18 años, 1 mes
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.