Einzelnen Beitrag anzeigen

Timelesk

Registriert seit: 24. Jul 2004
72 Beiträge
 
#1

Thread, Synchronize, MessageDlg & Interaktion

  Alt 20. Jul 2010, 17:13
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
  Mit Zitat antworten Zitat