Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: Pascal: Threaded Timer

Metabolix [17.06.2004 18:29:23]

#

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.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta