Einzelnen Beitrag anzeigen

Kishmet

Registriert seit: 29. Okt 2020
Ort: Großraum Stuttgart
34 Beiträge
 
Delphi 12 Athens
 
#1

HttpClient wirft Fehler 12019 wenn zweitesmal aufgerufen (gelöst)

  Alt 11. Jan 2024, 16:55
Hallo zusammen,

ich versuche gerade Schaltflächen zu designen die auf die zugrundeliegende IP "Pingen" und den Status der URL abfragen, speziell in hinblick auf die Userauthentification. Leider scheitere ich gerade daran und hoffe das mir hier jemand helfen kann.

Ich erzeuge mit FMX einen Frame (Dieser ist die Basis für die Schaltfläche) der mit etwas Daten gefüllt ist. Eines der Elemente ist eine TPaintbox, in der ich farblich den Status darstellen möchte.

Im OnPaintevent der Paintbox ist folgendes hinterlegt (Der Code wurde entsprechend angepasst in Reaktion auf Himitsus Post):
Delphi-Quellcode:
procedure TPCConnectFrame.RefreshStateIcon;
var
  Checkup_ready : Boolean;
  response : IHTTPResponse;
  Response_msg : String;
  Item : TmyItem; //enthält nutzername, passwort, http addresse (als property mit getter da abhängig von Gerätetyp)
begin
  Checkup_ready := FALSE;
  //einige Arbeiten für die "initialisierung" der Funktionskomponenten
  Item := ÜbergebendeKlasse.Items[0];
  ...
  //Weiterer Code zur gestaltung der Painbox und unterscheidungen
  ...
  TThread.CreateAnonymousThread(
      procedure
      var
        Netclient_Checker : TNetHTTPClient;
      begin
        //Das create (natürlich) immer vor das Try! - war mir beim ersten Übertrag hier ins Forum verrutscht
        Netclient_Checker := TNetHTTPClient.Create(nil); //Hier lag der erste Fehler! Ich hatte ein Self für das create verwendet, aber wie himitsu richtig gesehen hat ist dies so nicht richtig!
        try
          Netclient_Checker.CredentialsStorage.AddCredential(TCredentialsStorage.TCredential.Create(TAuthTargetType.Server, '', '', Item.Username, Item.Password));
          try
            ...
            response := Netclient_Checker.get(Item.http_Address);
            //Weiterer Code
            ...
          except
            ...
            //Fehlerbehandlung für den TNetHTTPClient im falle einer exception. bspw. wenn die Kamera nicht erreichbar ist und ein timeout entsteht.
            ...
          end;
        finally
          Checkup_ready := TRUE;
          Netclient_Checker.Free; //Ebenfalls mit FreeAndNil versucht weil ich ein unsauberes Schließen im Verdacht hatte
        end;
      end).Start;

    while not Checkup_ready do
    begin
      Application.ProcessMessages;
    end;

    //Weiterer Code
end;
Wenn ich das Element, auf dem das Verknüpft ist nun das erste mal erzeuge passt auch alles. Die gesamte Schaltfläche wird korrekt initialisiert und der Code läuft entsprechend durch.

Jetzt zu meinen beiden Problemen:
  1. Ich würde erwarten, dass ich wenn ich während der Ausführung irgendwo anders hinklicke dieser click auch ausgeführt wird, da ich ja während der thread läuft in der Schleife mit Application.processmessages festsitze. leider klappt das nicht und mir leuchtet gerade nicht ein warum?
  2. Wenn ich den Tab wechsel und zurück komme, klappt der Code oben plötzlich nichtmehr sondern wirft eine Fehlermeldung bei der zeile
    Code:
    response := Netclient_Checker.get(Item.http_Address);

    Zitat:
    Im Projekt MeineApp.exe ist eine Exception der Klasse ENetHTTPException mit der Meldung 'Fehler beim Abrufen der Header: (12019) Der Status des Handles entspricht nicht dem angeforderten Vorgang' aufgetreten.

Ich bin mir recht sicher das der Fehler ein Threadingproblem ist, da ich wenn ich es durchdbugge keine Probleme habe, ebenfalls keine Probleme habe ich, wenn ich den anonymen Thread weglasse. Außerdem wird die Schaltfläche immer wenn ich wieder auf den Tab zugreife gelöscht und komplett neu initialisiert. Es sollte sich also immer um einen "Clean" start handeln.

Ist für einen der alten Hasen hier ersichtlich was ich falsch mache?

Geändert von Kishmet (12. Jan 2024 um 10:14 Uhr)
  Mit Zitat antworten Zitat