Tämä on ajastinobjekti, joka kulkee omassa säikeessään, mistä seuraa että se on jonkin verran tarkempi kuin alkuperäinen Timer-komponentti.
Koska tämä ei ole komponentti vaan objekti, tämä täytyy itse lisätä joko formin public-osioon tai ohjelman muuttujalistaan ja muistaa luoda ennen käyttöä.
ThdTimer.pas
unit ThdTimer;
interface
uses
  Classes, Windows;
type
  (* Luodaan TThreadista, koska se on helpoin tapa saada oma säie. *)
  TThdTimer = class(TThread)
  private
    (* Tämä kertoo, onko ajastin päällä *)
    FEnabled: Boolean;
    (* Tämä on aikaraja *)
    FInterval: Cardinal;
    (* TNotifyEvent, joka suoritetaan, kun ajastin laukeaa *)
    FOnTimer: TNotifyEvent;
    (* Tätä tarvitaan toimintaan *)
    FStop: THandle;
  protected
    (* Suoritettava osa *)
    procedure Execute; override;
  public
    (* Constructor *)
    constructor Create(CreateSuspended: Boolean);
    (* Propertyt aiemmille ominaisuuksille *)
    property Enabled: Boolean read FEnabled write FEnabled;
    property Interval: Cardinal read FInterval write FInterval;
    property OnTimer: TNotifyEvent read FOnTimer write FOnTimer;
    (* Thread kutsuu tätä aikarajan ummetessa *)
    procedure Go;
  end;
implementation
(* Tätä kutsutaan, kun ajastin laukeaa. Tarkistetaan, että OnTimer on määritetty ja olemme käynnissä *)
procedure TThdTimer.Go;
begin
  if (Assigned(OnTimer) and Enabled) then OnTimer(Self);
end;
(* Constructor, kutsuu aiempaa ja asettaa oletusarvot ominaisuuksille *)
constructor TThdTimer.Create(CreateSuspended: Boolean);
begin
  inherited Create(CreateSuspended);
  FStop := CreateEvent(nil, False, False, nil);
  FInterval := 10;
  FEnabled := True;
end;
(* Tätä suoritetaan jatkuvasti.
   Niin kauan, kuin ollaan käynnissä, odotetaan aikarajan verran FStopia, joka ei koskaan vastaa :) *)
procedure TThdTimer.Execute;
begin
  while not Terminated do
    if WaitForSingleObject(FStop, FInterval) = WAIT_TIMEOUT then
      Synchronize(nil, Go);
end;
end.Esimerkki
unit Unit1;
interface
uses
  Forms, ThdTimer;
type
  TForm1 = class(TForm)
    procedure TimerTimer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  public
    Timer: TThdTimer;
  end;
var
  Form1: TForm1;
  Timer2: TThdTimer;
implementation
{$R *.dfm}
procedure TForm1.TimerTimer(Sender: TObject);
begin
  Form1.Color := (Form1.Color + $010101) and $ffffff;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
  Form1.Color := (Form1.Color) xor (Random(3) * $77 + Random(3) * $7700 + Random(3) * $770000);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  (* Luodaan ajastimet, asetetaan aikaraja ja toiminto *)
  Timer := TThdTimer.Create(False);
  Timer.Interval := 10;
  Timer.OnTimer := TimerTimer;
  Timer2 := TThdTimer.Create(False);
  Timer2.Interval := 1000;
  Timer2.OnTimer := Timer2Timer;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
  Timer.Destroy;
  Timer2.Destroy;
end;
end.Aihe on jo aika vanha, joten et voi enää vastata siihen.