Hi,
ich hantiere momentan mit Threads herum und bin dabei auf ein Problem gestoßen, welches ich nicht beheben kann.
Aufgabe
Ich lader per Thread Informationen von einer Website und möchte, dass bei einer Fehlermeldung (Ausgabe der Website) der Benutzer per MessageDlg interagieren kann.
Hierbei wählt er ob er sich erneut anmelden möchte.
Ablauf
Delphi-Quellcode:
procedure UpdateError();
var
Response: Integer;
begin
Response := MessageDlg('Erneut anmelden?', mtWarning, [mbYes,mbNo], 0);
if Response = mrYes then
begin
Main.StartThread('login');
end
else
begin
Main.Pager.ActivePage := 3;
end;
end;
function getSourcecode(): Boolean
begin
//Lade Ausgabe von Website
//...
//Prüfe ob die Ausgabe erfolgreich war
Result := checkSourcecode(Sourcecode);
if not(Result)
begin
Self.Terminate;
Synchronize(UpdateError);
end;
end;
Fragen
1) Wenn ich das Terminate in die Procedure UpdateError reinpacke, worauf bezieht sich dann das Self? Immernoch auf den Thread oder auf den Thread des Hauptformulars? Weil durch Synchronize wird ja die Funktion im Hauptthread ausgeführt, oder?
2) Ich habe festgestellt, dass der SubThread wartet, bis die Procedure UpdateError vollständig ausgeführt wurde. D.h. bis mein MessageDlg bestätigt wurde. Kann man das umgehen? Also der Thread soll dann einfach "auslaufen", sich beenden. Er hat seine Arbeit getan, er soll halt nur noch den MessageDlg anzeigen und gut ist.
Momentan ist es so, dass sich das Programm vollständig aufhängt sobald ich auf Ja klicke.
Ich kann 20x auf Nein klicken und dann auf Ja und es friert vollständig ein.
Wenn ich direkt nach Response := MessageDlg(...); ein exit; einbaue, so funktioniert es jedoch.
D.h. es muss irgendetwas mit dem Beenden & Starten der Threads zu tun haben.
Die Funktion StartThread(String) prüft übrigens im Vorfeld, ob der Thread aktiv ist und beendet ihn.
Hoffe ich konnte mein Problem klar vorbringen und hoffe es gibt auch eine Lösung für mein Problem
Freue mich schon auf eure Antworten.
Vielen Dank.
lg
Timelesk