Question

Je veux télécharger un fichier à partir d'Internet et j'imagine que cela devrait être une tâche simple. Essayer plusieurs différentes approches que j'ai trouvé que chacun a son propre inconvénient. Les principaux problèmes sont les suivants:

  • application se bloque jusqu'à ce qu'il télécharge le fichier
  • L'application se fige à jamais si la connexion Internet est perdu / serveur ne répond pas.

(détails:

Comment récupérer un fichier à partir d'Internet via HTTP?
La connexion ne fonctionne pas tout délai d'attente de téléchargement du fichier à partir d'Internet )

Alors, enfin j'ai utilisé les suggestions que j'ai reçu de plusieurs personnes d'utiliser les bibliothèques « pro » comme Indy. Cependant, Indy n'est pas beaucoup mieux que les morceaux de code que j'ai essayé (mais il est beaucoup plus vaste et difficile à maintenir). Tout en utilisant Indy l'application ne gèle pas seulement pour de courtes périodes il est donc encore (en quelque sorte) utilisable. Cependant, l'application ne peut pas être arrêté jusqu'à ce que la fin du téléchargement (jamais si les connexions Internet est cassé).

D'autres personnes ont signalé le même problème: http: //borland.newsgroups.archived.at/public.delphi.internet.winsock/200609/0609079112.html
https://forums.embarcadero.com/thread.jspa?threadID=25199&tstart= 90

Alors, il y a quelques bidouillages que je devais faire pour TIdAntiFreeze afin de le faire fonctionner?

En outre, la propriété ConnectTimeout ne reconnaît pas.

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

Devrais-je baisse Indy et retour à idée originale de télécharger le fichier dans un thread séparé et terminer le fil quand il ne répond pas (au moins de cette façon que je me débarrasse des bibliothèques 3ème partie)? Il y aura des effets secondaires imprévus si je fais cela?

Utilisation:. Delphi 7, Indy 10.1.5 10.5 (probablement)

Merci

Était-ce utile?

La solution

Il est pas trop difficile à résoudre ce genre de problèmes. La première chose que vous devez faire est de vous assurer que vous avez correctement manipulé le traitement des erreurs. Si quelque chose ne puis faire en sorte que tout se nettoie correctement. Au-delà si le code de téléchargement fait partie d'un thread séparé. En cas de problème, vous pouvez toujours résiliez le fil de votre programme principal. Voici le code (pour le téléchargement, et non le filetage) qui fonctionne très bien pour moi.

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;

Autres conseils

Vous avez probablement besoin d'utiliser Indy comme Indy: l'aide de fils. Indy a été spécialement conçu pour fonctionner en mode blocage, parce que ce fonctionnement de la plupart des protocoles Internet (exemple: avec HTTP, au niveau du protocole, vous envoyez une demande alors vous lire la réponse Vous n'envoyer et recevoir en même temps.). TIdAntiFreeze est censé vous aider à utiliser certaines fonctionnalités Indy sans traiter avec des fils; Je ne ai jamais utilisé, parce que, au moins conceptualy, c'est une bidouille horrible.

Si ne veulent pas traiter avec des fils alors vous devriez jeter un oeil à ICS ( lien vers ICS page d'accueil ). ICS a été conçu pour être utilisé en mode asynchrone, sans filetage. Il n'a pas besoin de l'équivalent de TIdAntiFreeze parce qu'il ne bloque. Vous commencez un téléchargement et vous gérez des événements pour obtenir les progrès et les notifications d'achèvement. ICS est aussi bien connu, professionnel et sauvagement utilisé comme Indy.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top