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