https://foro.gambas-es.org/viewtopic.php?f=1&t=1752
-----------------------------------
Invitado
Sabado, 23 Julio 2011, 21:39

Cola De Descargas (solucionado)
-----------------------------------
Buenas, tengo un problema con lo que llamo una "cola de descargas".. Intentaré explicarme.. 

Tengo una matriz de string con enlaces (un numero variable de enlaces) y me gustaría que se descarguen (con wget) uno tras otro (no a la vez) hasta que se terminen... El problema es que no puedo porque si meto un bucle el programa se bloquea esperando el final del bucle..

Se que hay una aplicación donde se hace algo por el estilo (downloadergoear).. Pero no saco nada en claro.. :S

Aquí el fragmento del proyecto: http://www.megaupload.com/?d=JD3HVJRA


-----------------------------------
soplo
Sabado, 23 Julio 2011, 23:28

Re: Cola De Descargas
-----------------------------------
No he ido al enlace pero si lo que tu quieres es bajarte una lista de enlaces con wget ¿porque no usas wget?

Extraído de wikipedia[code linenumbers=false syntax=gambas]
* Recoger sólo los enlaces específicos listados línea a línea en 
* el archivo local "my_movies.txt" 
* Usar una espera arbitraria de 0 a 33 segundos entre archivos.
* Cuando hay un fracaso, reintente para hasta 22 veces con 48 segundos 
* entre cada reintento. No envíe ningún agente de usuario en absoluto. Ignore exclusiones de robot.
* Colocar todos los archivos capturados en el directorio "/movies" 
* y recoger los resultados de acceso al archivo local "my_movies.log"
* Bueno sólo para descargar imágenes específicas conocidas u otros archivos.
wget -t 22 --waitretry=48 --wait=33 --random-wait --user-agent="" 
     -e robots=off -o ./my_movies.log -P/movies -i ./my_movies.txt[/code]
[url=http://es.wikipedia.org/wiki/GNU_Wget]Enlace

No necesitas nada salvo facilitarle a wget los datos oportunos y él lo hace todo.


-----------------------------------
Invitado
Domingo, 24 Julio 2011, 10:09

Re: Cola De Descargas
-----------------------------------
El wget ya lo estoy usando con SHELL(), y probé eso mismo pero desde concola de comandos, leer desde un fichero unos enlaces... 
Esa solución no me sirve (si hubieras mirado el comprimido...) porque efectivamente puedo leer los enlaces desde un fichero pero wget no se da cuenta de los cambios en el fichero...

fichero.txt que contiene:
http://imagen.png

Ejecutas
wget -i fichero.txt

Mientras se descarga agregas a fichero.txt:
http://imagen.gif

Solo descarga imagen.png :s


¿Alguna idea?


-----------------------------------
soplo
Domingo, 24 Julio 2011, 10:34

Re: Cola De Descargas
-----------------------------------
Osea que tu tquieres que mientras están descargando un archivo se le pueda dar la orden de que descargue otro detrás.

Pues para eso tienes que declarar una variable string[] y pensar bien a que nivel la declaras o bien utilizar un fichero.

Debe haber un método para llenar esa variable o fichero.
Debe haber otro método para hacer las descargas.

Ambos procesos deben ser concurrentes así que tienes que considerar a que nivel declarar esa variable o usar ese fichero. Lo que veo claro es que en vez de descargar una lista de ficheros con wget debes descargar solo uno y controlar cuando acabas si en la lista hay alguno mas. En ese caso descargas el siguiente pero solo el siguiente. La orden shell debe llear la claúsula wait para que no se haga en segundo plano o acabarás bajando varios ficheors a la vez, bueno que igual eso no es un problema.


-----------------------------------
razaAztk
Lunes, 25 Julio 2011, 05:39

Re: Cola De Descargas
-----------------------------------
Lo que pasa es que tienes que definir el manejador (si se llama así?¿?¿ je) del proceso, para saber en que momento termina la descarga (con el evento _Kill).
He modificado tu código, he agregado un botón llamado "bDown" que dispara las descargas.

[code linenumbers=false syntax=gambas]
' Gambas class file
PRIVATE enlaces AS NEW String[]

PUBLIC SUB Form_Open()
' enlaces.Add("ftp://ftp.rediris.es/sites/releases.ubuntu.com/releases//10.04/ubuntu-10.04-netbook-armel+imx51.img")
' enlaces.Add("ftp://ftp.rediris.es/sites/releases.ubuntu.com/releases//10.04/ubuntu-10.04-netbook-armel+imx51.img")
' enlaces.Add("ftp://ftp.rediris.es/sites/releases.ubuntu.com/releases//10.04/ubuntu-10.04-netbook-armel+imx51.img")
enlaces.Add("http://dl.dropbox.com/u/3701367/www/images/anarquia_peque.gif")
enlaces.Add("http://dl.dropbox.com/u/3701367/www/images/cargando.gif")
enlaces.Add("http://dl.dropbox.com/u/3701367/www/images/redstar.jpg")

listado.Columns.Count = 1
listado.Rows.Count = enlaces.Count
mostrarDatos()
END

PUBLIC SUB bAgregar_Click()
  enlaces.Add(enlace.Text)
  listado.Rows.Count = enlaces.Count
  mostrarDatos()
END

PRIVATE FUNCTION mostrarDatos()
  DIM i AS Integer = 0
  
  FOR i = 0 TO enlaces.Length - 1 STEP 1
    listado[i, 0].Text = enlaces[i]
  NEXT 
END

' PUBLIC SUB listado_DblClick()
'   SHELL ("wget " & enlaces[listado.Row])
' END

PUBLIC SUB bDown_Click()

  IF listado.Rows.Count THEN 
    bDown.Enabled = FALSE
    EXEC ["wget", listado[0, 0].Text] FOR READ AS "downProc"
  ENDIF 

END

PUBLIC SUB downProc_Kill()
  
  listado.Rows.Remove(0)
  listado.Refresh()
  IF listado.Rows.Count THEN 
    EXEC ["wget", listado[0, 0].Text] FOR READ AS "downProc"
  ELSE 
    bDown.Enabled = TRUE
  ENDIF 
  
END

[/code]

Creo que el anterior código cumple con lo que quieres.

Saludos!

EDITO:
Otra cosa, no veo la necesidad de vaciar los enlaces a un array y luego al gridView. Puedes hacerlo todo directo con el gridView.


-----------------------------------
Invitado
Lunes, 25 Julio 2011, 08:40

Re: Cola De Descargas
-----------------------------------
Ohh.. Que grande eres... Estaba modificando el proyecto para hacer la chapuza del siglo pero parece que me libro de ello...
Gracias...


