Thema: timer

Einzelnen Beitrag anzeigen

arcon

Registriert seit: 8. Jun 2010
71 Beiträge
 
#7

AW: timer

  Alt 14. Sep 2010, 15:31
ich habe folgenden code im web gefunden .. jedoch habe ich damit meine probleme ...

Code:
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;
das ganze habe ich auf
http://www.delphi-library.de/viewtopic.php?p=463391
gefunden.

kann mir jemand erklären, wie und wo ich das ereignis hinschreiben muss, sobald der timer abgelaufen ist ?
  Mit Zitat antworten Zitat