...die Label Übergabe mit Synchronize dauert eine Milisekunde und die
DB Abfrage läuft schön gemütlich im Thread und nichts wird blockiert.
Wenn ein Thread die Synchronize-Methode aufruft, dann heisst das noch lange nicht, dass die übergebene Methode sofort ausgeführt wird.
Beispiel:
Delphi-Quellcode:
procedure TUhrenThread.UhrzeitLabelAnzeigen;
begin
// wird im Kontext des Hauptthreads ausgeführt
Form1.UhrzeitLabel.Text := TimeToStr(Now);
end;
procedure TUhrenThread.Execute;
begin
while not Terminated do
begin
Sleep(1000);
// Synchronize schickt nur eine Message an den Hauptthread
Synchronize(UhrzeitLabelAnzeigen);
end;
end;
Würde der Hauptthread durch eine längere Berechnung sagen mir mal 15 Sekunden blockiert werden, dann würde der UhrenThread munter weiterlaufen und über Synchronize 15 Messages an den Hauptthread schicken.
Der Hauptthread kann die Messages aber erst wieder verarbeiten, nach dem er 15 Sek blockiert war.
Jetzt "sieht" der Hauptthread 15 Messages und führt 15 Mal TUhrenThread.UhrzeitLabelAnzeigen aus. (für eine flüssige Uhrzeitanzeige ist es viel zu spät)
==>
wenn der Hauptthread blockiert, dann friert auch das User Inferface / die Anzeige ein.
Also: der Hauptthread darf/sollte nie längere Zeit blockieren.
Man könnte z.B. die Kommunikation über
TCP/
IP und den Zugriff auf die Datenbank in einen Thread packen.
Dann wäre der Hauptthread ohne Blockade und eine Anzeige einer Uhrzeit wäre kein Problem.