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