Autor Beitrag
colaka
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 200
Erhaltene Danke: 4

Win XP, W7
Delphi 2005 Prof.
BeitragVerfasst: Sa 08.01.11 15:54 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Sa 08.01.11 16:57 
Du lädst wo, wie herunter?
FTP,HTTP von einem Server?
Hängt sich auf, wie, warum? (?Timeout)

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
colaka Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 200
Erhaltene Danke: 4

Win XP, W7
Delphi 2005 Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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:

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


Dann startet der Timer von Neuem. Versuche es doch mal

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Sa 08.01.11 18:07 
Mit welchen Komponenten "lädst Du herunter"
Gibt es da keinen einstellbaren Timeout, keine Fehlerbehandlungsmöglichkeit.

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 200
Erhaltene Danke: 4

Win XP, W7
Delphi 2005 Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.

Für diesen Beitrag haben gedankt: colaka
colaka Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 200
Erhaltene Danke: 4

Win XP, W7
Delphi 2005 Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 159



BeitragVerfasst: 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.