Einzelnen Beitrag anzeigen

shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#9

AW: Wie eine Uhr über einen Thread aktualisieren

  Alt 5. Nov 2010, 17:24
...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.
Andreas
  Mit Zitat antworten Zitat