AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit TIdHTTP.Get ?

Offene Frage von "nru"
Ein Thema von nru · begonnen am 22. Jan 2013 · letzter Beitrag vom 24. Jan 2013
Antwort Antwort
nru

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

Problem mit TIdHTTP.Get ?

  Alt 22. Jan 2013, 08: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
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#2

AW: Problem mit TIdHTTP.Get ?

  Alt 22. Jan 2013, 15:14
Erstellst du für jeden Thread wieder eine neue Instanz der TIdHTTP Komponente? Weil das könnte das Problem sein.
Sebastian
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#3

AW: Problem mit TIdHTTP.Get ?

  Alt 22. Jan 2013, 15:33
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:

program MyApp;

...

{$SetPEFlags IMAGE_FILE_NET_RUN_FROM_SWAP} 
{$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP}

...
Und das Problem verschwand.

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.
Michael Justin
  Mit Zitat antworten Zitat
nru

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

AW: Problem mit TIdHTTP.Get ?

  Alt 22. Jan 2013, 17:59
Erstellst du für jeden Thread wieder eine neue Instanz der TIdHTTP Komponente? Weil das könnte das Problem sein.
Ja. Eigene Threads, eigenen TIdHTTP's. Dachte, das wär ok. Aber Dein Link war natürlich irgendwo doch erhellend.

In einer Serverumgebung hatte ich diese Abstürze mit der angegebenen Fehlermeldung erfolgreich behandeln können mit PE Header Änderungen.
Danke für den Hinweis. Das werd ich checken (und berichten).

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

Geändert von nru (22. Jan 2013 um 18:06 Uhr)
  Mit Zitat antworten Zitat
nru

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

AW: Problem mit TIdHTTP.Get ?

  Alt 24. Jan 2013, 09:24
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
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#6

AW: Problem mit TIdHTTP.Get ?

  Alt 24. Jan 2013, 12:46
Ich habe mir dafür ein http://www.delphipraxis.net/170017-httpmanager.html gebastelt, wo immer nur eine Verbindung stattfindet. Aber die Fehlermeldung ist mMn eher untypisch für deinen Fehler. Vorallem weil du innerhalb von einem Tag nur 60 Verbindungen hast.
Sebastian
  Mit Zitat antworten Zitat
nru

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

AW: Problem mit TIdHTTP.Get ?

  Alt 24. Jan 2013, 13:17
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz