Frage

Ich mag eine Datei aus dem Internet herunterladen und ich denke, dies eine einfache Aufgabe sein sollte. Der Versuch, mehrere verschiedene Ansätze habe ich gefunden, dass jeder seinen eigenen Nachteil hat. Die wichtigsten Punkte sind:

  • Anwendung friert, bis er die Datei herunterlädt
  • Anwendung friert immer wenn die Internetverbindung verloren / Server antwortet nicht.

(Details:

Wie man eine Datei aus dem Internet über HTTP?
Die Verbindung wird nicht Timeout während Datei aus dem Internet herunterzuladen )

So, endlich habe ich die Vorschläge, die ich von mehreren Leuten bekam „pro“ Bibliotheken wie Indy zu verwenden. Allerdings ist Indy nicht viel besser als die Teile des Codes ich versucht habe (aber es ist viel viel größer und schwer aufrecht zu erhalten). Bei der Verwendung der Anwendung Indy tut friert nicht nur für kurze Zeit, so dass es immer noch (irgendwie) verwendbar ist. Allerdings kann die Anwendung nicht, bis der Download beendet ist heruntergefahren werden (nie, wenn die Internetverbindungen unterbrochen werden).

Andere Menschen berichteten das gleiche Problem: http: //borland.newsgroups.archived.at/public.delphi.internet.winsock/200609/0609079112.html
https://forums.embarcadero.com/thread.jspa?threadID=25199&tstart= 90

So wird ein Teil dort Hacking ich TIDAntiFreeze, um zu tun hatte, damit es funktioniert?

Auch ist die Eigenschaft Connect nicht erkannt.

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

Should I Drop Indy und Rückkehr zur ursprünglichen Idee, die Datei in einem separaten Thread der Herunterladen und das Fadenende, wenn er nicht antwortet (zumindest auf diese Weise ich von 3rd-Party-Bibliotheken loswerden)? Es wird unvorhergesehene Nebenwirkungen, wenn ich dies tun?

Mit:. Delphi 7, Indy 10.1.5 10,5 (wahrscheinlich)

Danke

War es hilfreich?

Lösung

Es ist nicht allzu schwierig, diese Art von Problemen zu lösen. Das erste, was Sie tun müssen, ist sicher, dass Sie richtig Fehlerbehandlung behandelt haben. Wenn etwas schiefgeht, dann stellen Sie sicher, alles richtig aufräumt. Darüber hinaus stellen Sie sicher, ist der Download-Code ein Teil eines separaten Thread. Wenn es irgendein Problem ist, können Sie immer den Faden aus dem Hauptprogramm beenden. Hier ist der Code (zum Herunterladen, nicht nur das Gewinde), die gut für mich funktioniert.

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;

Andere Tipps

Sie müssen wahrscheinlich die Indy Art und Weise verwenden, Indy: Verwendung von Threads. Indy wurde speziell im Blockiermodus zu arbeiten entworfen, weil das ist, wie die meisten Internet-Protokolle Arbeit (Beispiel: mit HTTP, auf Protokollebene, können Sie eine Anfrage senden dann Sie die Antwort lesen Sie Dont Send und empfangen gleichzeitig.). TIdAntiFreeze soll Ihnen helfen, einige Indy-Funktionalität nutzen, ohne mit Threads zu tun; Ich habe nie verwendet, dass, weil zumindest Conceptualy, es ist eine hässliche Hack.

Wenn Sie wollen nicht mit Themen beschäftigen, dann sollten Sie einen Blick auf ICS nehmen ( Link zu ICS Homepage ). ICS wurde entwickelt in asynchronem Modus verwendet werden, ohne Gewinde. Es ist nicht das Äquivalent von TIdAntiFreeze müssen, weil es nicht blockt. Sie starten eine Download und Sie behandeln einige Ereignisse Fortschritt und Abschluss-Benachrichtigungen zu erhalten. ICS ist ebenso gut bekannt, professionell und wild verwendet als Indy.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top