![]() |
Problem mit TIdHTTP.Get ?
Hallo zusammen,
in meinem D7-Projekt (RSSFeed-Reader) werden mehrere Threads gestartet, die parallel RSS-Feeds abrufen. In unregelmäßigen Abständen und nicht vorhersehbar kommt es zu Abstürzen, die leider so nicht reproduzierbar sind. Das macht die Sache natürlich nicht gerade einfacher. Die Beschreibung im Windows-Ereignisdienst sagt:
Code:
In der Anwendung wird, nach Prüfung der Erreichbarkeit der url ein get aufgerufen. Das alles ist in den Threads auch schon in try/except Blöcken gekapselt.
Aus einem der folgenden Gründe kann nicht auf die Datei "" zugegriffen werden: Es besteht ein Problem mit der Netzwerkverbindung, dem Datenträger mit der gespeicherten Datei bzw. den auf dem Computer installierten Speichertreibern, oder der Datenträger fehlt. Das Programm TSRSS.exe wurde wegen dieses Fehlers geschlossen
Alle Threads arbeiten nach dem folgenden Prinzip (Auszug aus dem Execute()). CallMessageFunc() sendet eine Nachricht über SendMessage() an den Mainthread, rein aus Dokumentationszwecken und um dem Problem auf den Grund zu gehen. Bei jedem Programmabbruch mit Ereignisdiensteintrag war diese Logzeile "VOR dem Get" das letzte, was die Anwendung noch getan hat. Deshalb meine Vermutung, dass mir das .get() hier Probleme bereitet. Ich verwende Indy10.
Delphi-Quellcode:
// Erreichbarkeit des RSSFeeds prüfen. Falls nicht Thread kontrolliert beenden
// Exceptions werden dort abgefangen und in CallErrorFunc gewandelt if (not Terminated) then begin if not CheckURL then exit; end; try CallMessageFunc( 'FeedThread #' + IntToStr( FID ) + ' ('+FeedName+') VOR dem Get', True ); Fhttp.get( FRSSLink, msData ); except on E:Exception do CallErrorFunc( e.message + ' [TFeedThread.Execute/FHttp.Get]'); end;
Delphi-Quellcode:
function TFeedThread.CheckURL: Boolean;
begin try FHTTP.Head( FRSSLink ); if (FHTTP.ResponseCode <> 200) then begin raise Exception.Create( 'Probleme mit dem Netz! Fehler: ' + FHTTP.ResponseText ); end; result := True; except on E:Exception do begin CallErrorFunc( e.message + ' - ' + FHTTP.ResponseText + ' [TFeedThread.CheckURL]' ); result := False; end; end; end; Aber wo könnte dieses Problem herkommen und warum kümmert sich der Fehler scheinbar einen Dreck um das Exception-Handling? Was kann ich noch tun, um diesem Problem Herr zu werden? Dank & Gruss Norbert |
AW: Problem mit TIdHTTP.Get ?
Erstellst du für jeden Thread wieder eine neue Instanz der TIdHTTP Komponente?
![]() |
AW: Problem mit TIdHTTP.Get ?
Der Code sieht ok aus. Ich glaube, das Problem liegt ausserhalb der Anwendung.
In einer Serverumgebung hatte ich diese Abstürze mit der angegebenen Fehlermeldung erfolgreich behandeln können mit PE Header Änderungen.
Delphi-Quellcode:
Und das Problem verschwand.program MyApp; ... {$SetPEFlags IMAGE_FILE_NET_RUN_FROM_SWAP} {$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP} ... Ursache ist unklar, es kann ein instabiles Netzwerk gewesen sein. Ist das Problem auf dem Entwicklungsrechner nachvollziehbar? Dann könnte leicht überprüft werden ob es daran lag. |
AW: Problem mit TIdHTTP.Get ?
Zitat:
Zitat:
Edit: Ist auf dem Entwicklungssystem bislang noch nicht feststellbar gewesen, wohl auch deshalb, weil die Anwendung dort nie wirklich lange läuft. Auf dem Echtsystem kommt das nach Stunden zum Vorschein. Gruss |
AW: Problem mit TIdHTTP.Get ?
Die Anpassungen der PE Header hab ich ja mal testen wollen und das auch getan.
Sie brachten immerhin eine ununterbrochenen Laufzeit von 28h (was ungefähr 60 RSS-Abrufen entspricht) und das war deutlich mehr als zuvor, aber letztlich kam's dann leider doch wieder zu dem hier schon erwähnten Fehler (s. Eventlog). Ich schätze, ich werde jetzt die Thread's bzw. deren Aufrufe derart umstrukturieren und Indy die Sockets schön nacheinander aufbauen lassen :roll: |
AW: Problem mit TIdHTTP.Get ?
Ich habe mir dafür ein
![]() |
AW: Problem mit TIdHTTP.Get ?
Das Problem wird sicher die annähernde Gleichzeitigkeit sein, mit der diese 60 Calls (zu je 5 Feeds=Threads=Indy Sockets) stattfinden.
Ich erklär's mir bisweilen so: 59 mal hat's Timing gerade so gepasst, beim 60. dann aber leider nicht mehr. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz