type
// die Demo-Thread-Timer-Klasse
TTimerThread = class(TThread)
private
FID: Integer; // ID des Threads
FTimeout: Integer; // Laufzeit in Millisekunden
FStep: Integer; // Schrittweite in Millisekunden
FLog: TStrings; // Ausgaben hier anfügen
FLogLine: String; // Zeile, die synchronisiert angefügt werden soll
protected
procedure SyncLogLineAdd; // synchronisierte Anfügemethode
procedure LogIt(const S: String); // interne Logausgabe
public
// neues Objekt anlegen, beschreibende Werte direkt übergeben
constructor Create(const AID, ATimeout, AStep: Integer; // s.o.
const ALog: TStrings; // s.o.
const AOnTerminate: TNotifyEvent); // beim Ende aufrufen (synchronisiert)
procedure Execute; override; // hier wird gearbeitet -> also gewartet... ;)
end;
implementation
// -----------------------------------------------------------------------------
// TTimerThread
constructor TTimerThread.Create(const AID, ATimeout, AStep: Integer;
const ALog: TStrings; const AOnTerminate: TNotifyEvent);
begin
inherited Create(TRUE); // gestoppt erzeugen
// Werte übernehmen
FID := AID;
FTimeout := ATimeout;
FStep := AStep;
FLog := ALog;
OnTerminate := AOnTerminate;
FreeOnTerminate := TRUE;
if Assigned(FLog) then // der Konstruktor läuft im Hauptthread, direkt ausgeben
FLog.Add('+++Thread(ID:'+IntToStr(FID)+', Timeout:'+IntToStr(FTimeout)+'ms, Step:'+IntToStr(FStep)+'ms) erzeugt.');
Resume; // los gehts!
end;
procedure TTimerThread.Execute;
begin
while ( (FTimeout >= 0) // solange der Timer noch nicht abgelaufen ist
and // und
(NOT Terminated) // der Thread noch laufen soll
) do begin
LogIt(' Thread '+IntToStr(FID)+': noch '+IntToStr(FTimeout)+'ms...');
Sleep(FStep); // nur den Thread schlafen legen - die Anwendung blockiert nicht!
Dec(FTimeout,FStep); // Auszeit anpassen
end;
LogIt('---Thread '+IntToStr(FID)+': beendet.');
end;
// interne Logausgabe (synchronisiert) machen
procedure TTimerThread.LogIt(const S: String);
begin
FLogLine := S; // die Ausgabe puffern
Synchronize(SyncLogLineAdd); // und synchronisiert in Log schreiben
end;
// Methode, um synchronisiert eine Logzeile zu schreiben
procedure TTimerThread.SyncLogLineAdd;
begin
if Assigned(FLog) then
FLog.Add(FLogLine); // gepufferte Zeile ausgeben (jetzt im Hauptthread!)
end;