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.