Einzelnen Beitrag anzeigen

nru

Registriert seit: 30. Mai 2008
Ort: Bonn
40 Beiträge
 
Delphi 7 Enterprise
 
#1

Problem mit TIdHTTP.Get ?

  Alt 22. Jan 2013, 07:40
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
  Mit Zitat antworten Zitat