Pregunta

Quiero descargar un archivo desde Internet y me imagino que esto debe ser una tarea sencilla. Probar varios enfoques diferentes que he encontrado que cada uno tiene su propia desventaja. Los temas principales son:

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

(detalles:

Cómo recuperar un archivo desde Internet a través de HTTP
La conexión no tiene tiempo de espera durante la descarga de archivos desde Internet )

Así que, finalmente utiliza 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 sólo por períodos cortos por lo que es todavía (de alguna manera) utilizable. Sin embargo, la aplicación no se puede apagar hasta que finalice la descarga (nunca si las conexiones a Internet se rompe).

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 la 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 gota Indy y retorno a la idea original de la descarga del archivo en un hilo separado y terminar el hilo cuando no responden (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

¿Fue útil?

Solución

No es demasiado difícil de resolver este tipo de problemas. Lo primero que tiene que hacer es asegurarse de que se han manejado adecuadamente el manejo de errores. Si algo falla, entonces asegurarse de que todo se limpia adecuadamente. Más allá de eso asegúrese de que el código de descarga es parte de un hilo separado. Si hay algún problema siempre se puede terminar el hilo de su programa principal. Aquí está el código (para descargar solamente, no la rosca) que está trabajando muy 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;

Otros consejos

Es probable que tenga que utilizar la forma de Indy Indy: el uso de hilos. Indy fue diseñado específicamente para trabajar en modo de bloqueo, porque así es como la mayoría de protocolos de Internet de trabajo (ejemplo: con HTTP, a nivel de protocolo, se envía una solicitud a continuación, leer la respuesta usted no enviar y recibir al mismo tiempo.). TIdAntiFreeze se supone que ayudará a utilizar algunas funciones Indy sin tener que lidiar con hilos; Nunca he usado eso porque, al menos Conceptualy, es un truco feo.

Si no quiere tratar con Hilos entonces usted debe echar un vistazo a ICS enlace "noreferrer nofollow" a la página de inicio del ICS ). ICS fue diseñado para ser utilizado en modo asíncrono, sin roscado. No se necesita el equivalente de TIdAntiFreeze porque no está bloqueando. Se inicia una descarga y manejar algunos eventos para obtener notificaciones de progreso y terminación. ICS es tan bien conocido, profesional y utiliza violentamente como Indy.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top