Autor Tema: Medir la descarga del ucDownload  (Leído 4035 veces)

0 Usuarios y 1 Visitante están viendo este tema.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Medir la descarga del ucDownload
« en: Octubre 01, 2011, 01:18:24 am »
usando el control de Cobein indicado aqui:
http://leandroascierto.com/foro/index.php?topic=1260.msg6894#msg6894

No logro medir el tiempo de descarga, creo sospechar que no es del todo posible. osea, quiero mostrar un progressbar del download, pero deberia saber el tiempo aproximado que tardaria la descarga.

Por el momento lo estoy usando como si fuera una animacion que indica que se esta descargando el archivo.
¿Creo que alli queda no? o se puede tantear cuanto tardara la descarga del archivo?

Gracias
Me encuentras en YAcosta.com

ADONAIRAFA

  • Gigabyte
  • ****
  • Mensajes: 291
  • Reputación: +37/-1
  • Que bien se siente al terminar un programa !!!
    • Ver Perfil
Re:Medir la descarga del ucDownload
« Respuesta #1 en: Octubre 01, 2011, 02:34:17 am »
Bueno mi estimado Yvan, te tengo estos códigos:


Medir el transcurso de tiempo de un proceso con el Api TimeGetTime:
Tomado de http://www.recursosvisualbasic.com.ar/htm/listado-api/200-api-timegettime.htm

Código: [Seleccionar]
    ' Api timeGetTime 
    Private Declare Function timeGetTime Lib "winmm.dll" () As Long 
__________________________________________________________________________

    Dim i As Long 
    Dim Inicio As Long 
     
    Me.MousePointer = vbHourglass 
     
    ' Punto de inicio. almacena los milisegundos desde que arrancó windows 
    Inicio = timeGetTime 
     
    ' Bucle
    List1.Clear 
    For i = 0 To 25000 
        List1.AddItem i 
        DoEvents 
    Next 
     
    Me.MousePointer = vbNormal 
     
    ' Divide el resultado por mil para obtener los segundos 
    MsgBox (timeGetTime - Inicio) / 1000 & " segundos


y este otro:
Cronometrar un proceso con el Api GetTickCount
Este Ejemplo muestra como cronometrar un proceso, por ejemplo un bucle y poder saber el tiempo que tardó en ejecutarse, usando el Api de windows:
Tomado de http://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/17.htm

Código: [Seleccionar]
'Api GetTickCount
'''''''''''''''''''''''''
    Private Declare Function GetTickCount Lib "kernel32" () As Long
___________________________________________________________________

    Dim x As Long
    Dim ret As Long
    Dim tiempo As Long
    Dim i As Long
    Dim max As Long
   
   
    Me.MousePointer = vbHourglass
   
    max = 15000
   
    'capturar el tiempo inicial desde que inicio windows _
     como para tener un punto de referencia.
    ret = GetTickCount / 1000
   
    'hacemos un bucle
    For i = 1 To max
        DoEvents
        Me.Caption = CStr(i) & "/" & CStr(max)
    Next
   
    'Volvemos a capturar el tiempo para restarlo al inicial
    'Se divide por mil por que lo devuelve en millonésimas de segundos
    x = GetTickCount / 1000
    'restamos
    tiempo = x - ret
   
    Me.MousePointer = vbDefault
   
    'Mostramos el tiempo transcurrido del bucle
    MsgBox tiempo & " segundos", vbInformation

Aquí el asunto es, que cualquiera de estos ejemplos los insertarías en una sub o donde quiera que fuese que hicieses la llamada para la descarga, y en el conteo de los segundos (o milisegundos) se lo fueses pasando como valor al ProgressBar (algo así, mas o menos, espero me captes, que en es un poquito engorroso el asunto, Je, Je).

Espero te pueda servir de alguna utilidad o como guía.

Saludos Hermano !!!


Manuel F. Borrego S. 8)
Hay dos tipos de personas: Los que siguen un camino... y los que hacen camino al avanzar !!!

Virgil Tracy

  • Kilobyte
  • **
  • Mensajes: 64
  • Reputación: +38/-1
    • Ver Perfil
Re:Medir la descarga del ucDownload
« Respuesta #2 en: Octubre 01, 2011, 04:41:15 am »
Usando un poco del codigo que tiene leandro en el ucImage, habria que cambiar el evento Downloading del ucDownload ( en la definicion y en el RaiseEvent )

Código: [Seleccionar]
' cambiar la definicion del evento
Public Event Downloading(BytesMax As Long, BytesLeidos As Long)

'y cambiar RaiseEvent
Private Sub UserControl_AsyncReadProgress(AsyncProp As AsyncProperty)
    With AsyncProp
        Select Case .StatusCode
            Case vbAsyncStatusCodeDownloadingData: RaiseEvent Downloading(.BytesMax, .BytesRead)
            Case vbAsyncStatusCodeError: c_bSinc = False
        End Select
    End With
End Sub


Y para probar, en un formulario agrega un progressbar y un commandbutton

Código: [Seleccionar]
Option Explicit

Private Sub Command1_Click()

With ProgressBar1

     .Min = 0
     .Max = 100
     .Value = 0
     
End With

ucDownload1.Download "http://cdn0.wickedweasel.com/assets/images/pics/0048/6763/7.jpg?1314315914", App.Path & "\ww.jpg"

End Sub

Private Sub ucDownload1_DownloadComplete(ByVal bSuccess As Boolean)

If bSuccess Then

   ProgressBar1.Visible = False
   Command1.Visible = False
   
   Set Me.Picture = LoadPicture(App.Path & "\ww.jpg")
   Me.WindowState = vbMaximized
   
End If

End Sub

Private Sub ucDownload1_Downloading(BytesMax As Long, BytesLeidos As Long)

'no es el tiempo que se demora, pero ya sabes cuantos bytes deben leerse y cuantos han sido leidos
ProgressBar1.Value = Int((BytesLeidos * 100) / BytesMax)

End Sub

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:Medir la descarga del ucDownload
« Respuesta #3 en: Octubre 01, 2011, 06:29:23 am »
Hola no es muy difícil, es un poco de lógica y algunas reglas de tres

no recuerdo bien como era el control de Cobein, pero se que maso menos te da la información necesaria, lo que vas a necesitar es un timer para ir estimando el tiempo.

y la cosa es asi , si vos en un segundo tenes cierta cantidad de bytes descargados. cuantos segundos vas a necesitar para descargar el resto de los bytes. esa seria básicamente la formula o la manera que deberías planteártelo.

hacerlo un poco mas avanzado es ir haciendo un promedio por segundo ya que si tomas un segundo solo como referencia y despues la conexión a internet baja o sube el calculo no seria muy certero.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Medir la descarga del ucDownload
« Respuesta #4 en: Octubre 01, 2011, 02:44:10 pm »
Gracias Virgil Tracy, tu ejemplo corre perfecto para mis fines. Y esta bastante comprensible.

Muchas gracias.

+1
Me encuentras en YAcosta.com

Virgil Tracy

  • Kilobyte
  • **
  • Mensajes: 64
  • Reputación: +38/-1
    • Ver Perfil
Re:Medir la descarga del ucDownload
« Respuesta #5 en: Octubre 01, 2011, 07:32:21 pm »
No se si leyendo la explicacion de Leandro o los rayos de su murcielago, pero se me ocurrio esto,  bueno, tambien viendo el codigo de su descargador (http://leandroascierto.com/blog/descargador/;D

En un formulario agregar dos label, un progressbar y un commandbutton

Código: [Seleccionar]
Option Explicit

Dim m_nTimer As Single

Private Sub Command1_Click()

With ProgressBar1

     .Min = 0
     .Max = 100
     .Value = 0
     
End With

' capturamos el tiempo de inicio
m_nTimer = Timer

ucDownload1.Download "http://cdn2.wickedweasel.com/assets/wallpapers/33/33-kira-1280x1024.jpg?1317260735", App.Path & "\ww.jpg"

End Sub

Private Sub ucDownload1_DownloadComplete(ByVal bSuccess As Boolean)

If bSuccess Then

   ProgressBar1.Visible = False
   Command1.Visible = False
   
   Label1.Visible = False
   Label2.Visible = False
   
   Set Me.Picture = LoadPicture(App.Path & "\ww.jpg")
   Me.WindowState = vbMaximized
   Me.Caption = "100% completado"

End If

End Sub


Private Sub ucDownload1_Downloading(BytesMax As Long, BytesLeidos As Long)
Dim c As String, c1 As String, c2 As String, c3 As String
Dim n As Double, n1 As Single, n2 As Single

' Regla de 3 simple
' BytesMax = 100 %
' BytesLeidos = x%
' x = ( BytesLeidos * 100 ) / BytesMax

'Porcentaje completado
n = (CDbl(BytesLeidos) * 100) / BytesMax
n = Int(n)

ProgressBar1.Value = n

Me.Caption = n & "% completado"




'Velocidad de tranferencia
n1 = Timer - m_nTimer

n = BytesLeidos / n1

Label2.Caption = "Velocidad Transferencia " & FormatKbPerSecond(n)




'Tiempo estimado
n2 = ((BytesMax - BytesLeidos) * n1) / BytesLeidos

c1 = GetFormatKB(BytesLeidos)
c2 = GetFormatKB(BytesMax)
c3 = SecondToTime(Val(n2))
   
Label1.Caption = "Tiempo Estimado " & c3 & " (" & c1 & " de " & c2 & " copiados)"


End Sub


'Las siguientes funciones fueron tomadas de aqui
'http://leandroascierto.com/blog/descargador/

'Función que retorna en KB los bytes que le pasemos.
Public Function GetFormatKB(Bytes As Variant) As String
    If Bytes >= 1024 Then
        GetFormatKB = Format((Bytes \ 1024) + 1, "##,###,##0") & " KB"
    Else
        GetFormatKB = Format(Bytes, "##,###,##0") & " Bytes"
    End If
   
End Function

'Función que retorna en KB los bytes que se descargaron en 1 segundo.
Public Function FormatKbPerSecond(ByVal Bytes As Long) As String
    If Bytes >= 1024 Then
        FormatKbPerSecond = Format((Bytes / 1024) + 1, "##,###,##0.00") & " Kb/Seg"
    Else
        FormatKbPerSecond = Format(Bytes, "##,###,##0.00") & " Bytes/Seg"
    End If
End Function

'Función que retorna en formato de hora los segundos que se le pasen.
Private Function SecondToTime(nTimeInSeconds As Long)

    Dim nHours              As Long
    Dim nMinutes            As Long
    Dim nSeconds            As Long
    Dim sTime               As String
   
    nHours = nTimeInSeconds \ 3600
    nTimeInSeconds = nTimeInSeconds Mod 3600
    nMinutes = nTimeInSeconds \ 60
    nSeconds = nTimeInSeconds Mod 60
   
    If nHours Then sTime = Format(nHours, "#0") & ":"
    SecondToTime = sTime & Format(nMinutes, "#0") & ":" & Format(nSeconds, "00")

End Function