Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: YAcosta 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 (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
-
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 (http://www.recursosvisualbasic.com.ar/htm/listado-api/200-api-timegettime.htm)
' 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 (http://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/17.htm)
'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)
-
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 )
' 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
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
-
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.
-
Gracias Virgil Tracy, tu ejemplo corre perfecto para mis fines. Y esta bastante comprensible.
Muchas gracias.
+1
-
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
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