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.