Entwickler-Ecke

Internet / Netzwerk - Download mittendrin abbrechen


colaka - Sa 08.01.11 15:54
Titel: Download mittendrin abbrechen
Hallo,

ich lade täglich die Preislisten von 14 Lieferanten herunter, um sie in meiner Wawi weiterzubearbeiten. Dabei kommt es gelegentlich vor, daß der Server mittendrin einfach seinen Dienst einstellt. Mein Programm hängt sich dann natürlich auf. Das würde ich in Zukunft gerne abfangen.

Ich könnte die Zeit messen, die das Herunterladen eines Lieferanten normalerweise dauert, und bei einer Überschreitung um sagen wir mal das Doppelte den Download gewaltsam beenden, um dann einfach mit dem nächsten Lieferanten weiterzumachen.

Da ich die Sache mit den Threads bis heute nicht kapiert habe, wüsste ich gern, ob es da irgendeine Möglichkeit gibt, sowas ohne Threads zu machen.

Danke Ebi


bummi - Sa 08.01.11 16:57

Du lädst wo, wie herunter?
FTP,HTTP von einem Server?
Hängt sich auf, wie, warum? (?Timeout)


colaka - Sa 08.01.11 17:23

Hallo,

ich lade die Dateien von den Servern der jeweiligen Lieferanten herunter, manche per HTTP andere per FTP, je nach Lieferant. Zu Begin des Downloads prüfe ich mit try ... finally, ob eine neuere Preisliste vorhanden ist. Dabei stelle ich ja auch fest, ob der Server erreichbar ist. Falls ja, lade ich die Datei herunter. Da die Lieferanten so zwischen 10.000 und 80.000 Artikel haben, dauert das Ganze fast eine Viertel Stunde (insgesamt). Zwischendrin muß ich die einzelnen Dateien auch noch verarbeiten, d.h. in meiner Artikeldatei die Preise und Verfügbarkeiten aktualisieren. Am Ladebalken kann man sehen, daß so ungefähr einmal im Monat der Server eines der Lieferanten mittendrin einfach stehenbleibt. Wie und warum, weiß ich natürlich nicht. Meistens ist er dann danach nicht mehr erreichbar. Aber mein Programm kann ich in so einem Fall nur noch mit dem Taskmanager beenden. Bis jetzt jedenfalls - oder weiß wer eine Lösung?

Danke Ebi


Tranx - Sa 08.01.11 17:41

Frage, hast Du es mit einem Timer versucht. Dort gibst Du dann die typische Abbruchzeit ein z.B. 100 Sekunden (als 100000, weil in ms).
Und wenn der Timer dann seine Ontimerprozedur aufruft, schreibst Du dann dort eine Abbruchprozedur.

Du musst dann bei jedem neuen Lieferanten nur einmal am Anfang schreiben:


Delphi-Quelltext
1:
2:
  Timer.Enabled := FALSE;
  Timer.Enabled := TRUE;


Dann startet der Timer von Neuem. Versuche es doch mal


bummi - Sa 08.01.11 18:07

Mit welchen Komponenten "lädst Du herunter"
Gibt es da keinen einstellbaren Timeout, keine Fehlerbehandlungsmöglichkeit.


jaenicke - Sa 08.01.11 18:10

Wenn das Programm hängt, wird der Timer nie ausgelöst werden.

Für diesen Zweck sind Threads im Grunde prädestiniert (und werden von Indy ja auch intern verwendet), lösen aber nicht das Problem, dass der Download hängt.

Eigentlich sollte das irgendwann in ein Timeout laufen. Indy verwendet aber blocking sockets, so dass es eben blockiert bis der Vorgang abgeschlossen ist. Dafür gibt es TIdAntiFreeze, das in solchen Situationen mit Application.ProcessMessages versucht das Einfrieren der Oberfläche zu verhindern.

Im Grunde wäre auch die Windows Update Agent API (glaube das war die richtige) eine Möglichkeit. Dann würde Windows den Download im Hintergrund erledigen und dich benachrichtigen, wenn er abgeschlossen ist.


colaka - Sa 08.01.11 18:50

Hallo,

so eine TIdAntiFreeze-Komponente habe ich bei meinen Indys gefunden.

Reicht das aus, wenn ich die einfach auf meine Form lege? Ich habe nichts gefunden, wie ich die meiner TIdFTP- bzw. TIdHTTP-Komponente zuweisen könnte.
Funktioniert das dann sowohl mit der TIdHTTP wie wie auch mit der TIdFTP-Komponente?

Ich würde dann einfach die Download-Geschwindigkeit überwachen und beim Unterschreiten eines bestimmten Wertes den Download abbrechen.

Ist IdFTP.Abort dafür der richtige Befehl?

Leider muß ich da wohl ein paar Wochen warten, um zu überprüfen, ob das funktioniert. Einen stehendbleibenden Server bei meinen Lieferanten kann ich ja schlecht simulieren.

Danke Ebi


jaenicke - Sa 08.01.11 18:54

user profile iconcolaka hat folgendes geschrieben Zum zitierten Posting springen:
Reicht das aus, wenn ich die einfach auf meine Form lege?
Ja, sollte ausreichen. Bei mir hat die leider nie viel gebracht. Aber theoretisch sollte es damit gehen.

Ich benutze dann doch lieber Threads, damit gar nicht das Problem mit dem Einfrieren kommt.


colaka - Sa 08.01.11 19:08

Hallo,

vielen Dank für die Anregungen. Ich werde das jetzt mit der TIdAntiFreeze-Komponente probieren und werde dann ja in den nächsten Wochen sehen, ob es was gebracht hat.

Ich weiß schon, mit einem Thread wäre das viel eleganter, aber damit habe ich mich schon öfters versucht. Da bin ich zu blöd dazu.

Tausend Dank
Ebi


Quake User - Sa 08.01.11 20:07

Zu den Downloads sollten Dir die Lieferanten Checksummen anbieten (bspw.: MD5)
Ermittle nach dem DL die CHecksumme und vergleiche Sie. Das ist eine sichere Prüfung darauf, ob die DL in Ordnung sind.