2010-07-06 5 views
5

Ich möchte eine Datei aus dem Internet herunterladen und ich stelle mir vor, dies sollte eine einfache Aufgabe sein. Bei mehreren verschiedenen Ansätzen habe ich festgestellt, dass jeder seinen eigenen Nachteil hat. Die wichtigsten Punkte sind:Die Verbindung nicht Timeout bei der Verwendung von Indy

  • Anwendung friert, bis er die Datei
  • Anwendung Downloads friert immer wenn die Internetverbindung verloren/Server reagiert nicht.

(Details:

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

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 Code-Teile, die ich ausprobiert habe (aber es ist viel größer und schwieriger zu warten). Bei der Verwendung von Indy friert die Anwendung nicht nur für kurze Zeit ein, so dass sie immer noch (irgendwie) verwendbar ist. Die Anwendung kann jedoch nicht heruntergefahren werden, bis der Download abgeschlossen ist (niemals, wenn die Internetverbindung unterbrochen wird).

Andere Leute 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 gibt es einige Hacken ich tun musste, um TIDAntiFreeze, damit es funktioniert?

Auch die ConnectTimeout-Eigenschaft wird nicht erkannt.

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

Soll mir fallen Indy und zurück zur ursprünglichen Idee, die Datei in einem separaten Thread der Herunterladen und das Fadenende, wenn er nicht reagiert (dest auf diese Weise, die ich von 3rd-Party-Bibliotheken loswerden)? Wird es unvorhergesehene Nebenwirkungen geben, wenn ich das tue?

Verwendung: Delphi 7, Indy 10.1.5 10.5 (wahrscheinlich).

Dank

+2

Haben Sie versucht, einen Thread zum Herunterladen der Datei im Hintergrund zu verwenden? – mjn

+2

Indy 10.1.5 ist sehr alt, aktuell ist 10.5.7 – mjn

+0

Die neue Version von Indy weigert sich, in meinem Computer zu installieren. – Ampere

Antwort

1

Es ist nicht zu schwierig, diese Art von Problemen zu lösen. Das erste, was Sie tun müssen, ist sicherzustellen, dass Sie die Fehlerbehandlung richtig behandelt haben. Wenn etwas fehlschlägt, dann stelle sicher, dass alles sauber gemacht wird. Darüber hinaus stellen Sie sicher, dass der Download-Code Teil eines separaten Threads ist. Wenn es ein Problem gibt, können Sie den Thread immer aus Ihrem Hauptprogramm beenden. Hier ist der Code (nur zum Herunterladen, nicht das Threading), der 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; 
+0

Dies deckt nicht den Hauptpunkt dieser Diskussion. Zitat: "Anwendung friert ein, bis sie die Datei herunterlädt." – Ampere

+0

Lies meinen Beitrag noch einmal und beziehe mich auch auf die Antwort von Cosmin Prund. Wir beide sagen, Sie müssen Threads verwenden, sonst gibt es keine Möglichkeit, dies zu verhindern. Selbst mit Indy musst du einen Faden benutzen, um den es keinen Weg gibt. Du hast gesagt, dass Indy für deine Bedürfnisse zu sperrig ist, deshalb habe ich eine getestete Alternative in Verbindung mit der Aussage geliefert, dass es sich um ein Gewinde handeln muss. Ich sehe nicht, wie diese Antwort Ihren Hauptpunkt nicht abdeckt. Antwort: Fädeln Sie es ein. – Daisetsu

+0

Akzeptierte Antwort. – Ampere

4

Sie müssen wahrscheinlich Indy die Indy Art verwenden: Verwenden von Threads. Indy wurde speziell dafür entwickelt, im Blocking-Modus zu arbeiten, denn so funktionieren die meisten Internetprotokolle (Beispiel: Mit HTTP, auf Protokollebene, senden Sie eine Anfrage, dann lesen Sie die Antwort. Sie senden und empfangen nicht gleichzeitig). TIdAntiFreeze soll Ihnen helfen, einige Indy-Funktionen zu verwenden, ohne Threads zu verwenden. Ich habe das nie benutzt, weil es zumindest konzeptionell ein hässlicher Hack ist.

Wenn Sie nicht mit Threads umgehen wollen, dann sollten Sie sich ICS ansehen (link to ICS home page). ICS wurde entwickelt, um im Async-Modus ohne Threading verwendet zu werden. Es benötigt nicht das Äquivalent von TIdAntiFreeze, da es nicht blockiert. Sie starten einen Download und behandeln einige Ereignisse, um Fortschritts- und Abschlussbenachrichtigungen zu erhalten.ICS ist ebenso bekannt, professionell und wild wie Indy.

+0

Nach Kreisen um Threads scheint es die einzige Lösung zu sein! Vielen Dank. +1 – Ampere

Verwandte Themen