Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: verhindern: Klick auf Titelleiste stoppt Programm

  Alt 27. Nov 2010, 13:33
Der Durchgriff vom Thread auf die visuellen Komponenten hat durchaus seine Tücken.

Der Hinweis im Quelltext (wenn man ein Thread-Objekt erstellt) alle Zugriffe auf die Oberfläche (HauptThread, bzw. einen anderen ThreadKontext) mittels Synchronize zu realisieren sollte man unbedingt beachten.

Allerdings muss gerade vor diesem Hintergrund folgendes beachten:
Delphi-Quellcode:
procedure TFooThread.Execute;
begin
  while not Terminated do
    begin
      Synchronize( MainForm.Method ); // Es geht erst dann weiter, wenn die Methode komplett abgearbeitet wurde
    end;
end;
Wenn jetzt der HauptThread der Anwendung blockiert ist (durch das Festhalten der TitelLeiste) dann würde in diesem Falle auch der Thread blockiert und damit haben wir hiermit keine Lösung des Problems.

Besser ist es in so einem Fall folgendes zu verwenden:
Delphi-Quellcode:
procedure TFooThread.Execute;
begin
  while not Terminated do
    begin
      Queue( MainForm.Method );
    end;
end;
Die Ausführung der Methode wird in eine Warteschlange gestellt und der HauptThread führt diese dann aus, wenn er wieder Zeit dafür hat. Der Thread wird aber nicht mehr blockiert.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat