2010-07-06 10 views
5

Quiero descargar un archivo de Internet y me imagino que esto debería ser una tarea sencilla. Probando varios enfoques diferentes, he encontrado que cada uno tiene su propio inconveniente. Los temas principales son:La conexión no excede el tiempo de uso de Indy

  • aplicación se bloquea hasta que se descarga el archivo
  • aplicación se bloquea para siempre si la conexión a Internet se pierde/servidor no responde.

(detalles:

How to retrieve a file from Internet via HTTP?
The connection does not timeout while downloading file from internet)

Así, finalmente utilizan las sugerencias que recibí de varias personas a utilizar las bibliotecas "pro" como Indy. Sin embargo, Indy no es mucho mejor que las piezas de código que he probado (pero es mucho más grande y difícil de mantener). Durante el uso de Indy, la aplicación no se congela solo por períodos cortos, por lo que todavía es (de alguna manera) utilizable. Sin embargo, la aplicación no se puede cerrar hasta que finalice la descarga (nunca si las conexiones a Internet se rompen).

Otras personas informaron el mismo problema: http://borland.newsgroups.archived.at/public.delphi.internet.winsock/200609/0609079112.html
https://forums.embarcadero.com/thread.jspa?threadID=25199&tstart=90

Por lo tanto, hay algo de piratería que tenía que hacer para TIDAntiFreeze con el fin de hacer que funcione?

Además, la propiedad ConnectTimeout no se reconoce.

fIDHTTP := TIDHTTP.Create(NIL); 
fIDHTTP.ConnectTimeout:=5000; 

¿Debo dejar Indy y volver a la idea original de la descarga del archivo en un hilo separado y terminar el hilo cuando no responde (al menos así me libro de las bibliotecas 3 ª parte)? Habrá efectos secundarios imprevistos si hago esto?

Uso: Delphi 7, Indy 10.1.5 10.5 (probablemente).

Gracias

+2

¿Ha intentado utilizar un hilo para descargar el archivo en segundo plano? – mjn

+2

Indy 10.1.5 es muy antiguo, la actual es 10.5.7 – mjn

+0

La nueva versión de Indy se niega a instalar en mi computadora. – Ampere

Respuesta

1

no es demasiado difícil de resolver este tipo de problemas. Lo primero que debe hacer es asegurarse de que ha manejado correctamente el manejo de errores. Si algo falla, asegúrese de que todo se limpie correctamente. Más allá de eso, asegúrese de que el código de descarga sea parte de un hilo separado. Si hay algún problema, siempre puede finalizar el hilo desde su programa principal. Aquí está el código (para descargar solo, no para enhebrar) que funciona bien para mí.

with TDownloadURL.Create(nil) do 
    try 
    URL := 'myurltodownload.com'; 
    filename := 'locationtosaveto'; 
    try 
     ExecuteTarget(nil); 
    except 
     result := false; 
    end; 
    if not FileExists(filename) then 
     result := false; 
    finally 
    clear; 
    free; 
    end; 
+0

Esto no cubre el punto principal de esta discusión. Cita: "La aplicación se congela hasta que descarga el archivo". – Ampere

+0

Lee mi publicación nuevamente y también consulta la respuesta de Cosmin Prund. Ambos decimos que DEBES USAR HILOS, de lo contrario no hay forma de evitar esto. Incluso con Indy necesitas usar un hilo, no hay forma de evitarlo. Dijiste que Indy era demasiado voluminosa para tus necesidades, así que proporcioné una alternativa probada junto con decir que DEBE estar enhebrada. No veo cómo esta respuesta no cubre tu punto principal. Respuesta: Hilo. – Daisetsu

+0

Respuesta aceptada. – Ampere

4

Probablemente necesite usar la manera de Indy Indy: usando hilos. Indy fue diseñado específicamente para trabajar en modo de bloqueo, porque así es como funcionan la mayoría de los protocolos de Internet (por ejemplo: con HTTP, a nivel de protocolo, envía una solicitud y luego lee la respuesta. No envía Y recibe al mismo tiempo). Se supone que TIdAntiFreeze te ayuda a usar algunas funciones de Indy sin tener que lidiar con hilos; Nunca lo usé porque, al menos conceptualmente, es un hack feo.

Si no desea tratar con Threads, debería echar un vistazo a ICS (link to ICS home page). ICS fue diseñado para ser utilizado en modo Async, sin enhebrar. No necesita el equivalente de TIdAntiFreeze porque no está bloqueando. Comienza una descarga y maneja algunos eventos para obtener notificaciones de progreso y finalización.ICS es tan conocido, profesional y ampliamente utilizado como Indy.

+0

¡Después de rodear los hilos parece que es la ÚNICA solución! Gracias. +1 – Ampere

Cuestiones relacionadas