Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   mein Timer (https://www.delphipraxis.net/54917-mein-timer.html)

supermuckl 13. Okt 2005 11:07


mein Timer
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi.
Ich habe unter Kylix das Bedürfniss gehabt, einen Timer ohne die System libs laufen zu lassen.
Nach ein paar Überlegungen hab ich mir dann einen Thread gebastelt, den ich jetzt als Timer benutzen kann.

Meine Frage wäre jetzt, ob dieser Code eventuell irgendwo Probleme machen könnte und ich etwas übersehen habe, oder wo man noch etwas verbessern könnte.
Wenn es final ist, darf es in die Codelib.

//edit
timercode geändert
sourcen neu geuppt

Folgender Code beinhaltet den Thread (Timer):

Delphi-Quellcode:
unit mt;

interface

uses
  Classes,SysUtils;

type TOnMuTimer = procedure of object;

type
  Tmuckltimer = class(TThread)
  private

  protected
  interv: integer;
  Evnt: TOnMuTimer;
    procedure Execute; override;
    procedure DoEvent;
    public
    constructor Create(Suspended:boolean;OnMuTimer:TOnMuTimer;Interval:integer);
  end;

implementation

constructor Tmuckltimer.Create(Suspended:boolean;OnMuTimer:TOnMuTimer;Interval:integer);
begin
Evnt := OnMuTimer;
self.FreeOnTerminate := true;
interv := interval;
inherited Create(suspended);
end;

procedure Tmuckltimer.Execute;
begin
  while not self.Terminated do begin
   sleep(interv);
   if not self.terminated then synchronize(DoEvent);
  end;
end;

procedure Tmuckltimer.DoEvent;
begin
    if Assigned(Evnt) then Evnt;
end;

end.
Folgender Code ist der Aufruf-Testcode:


Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,unit2;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure bla;
  end;

var
  Form1: TForm1;
  mu:Tmuckltimer;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 mu := Tmuckltimer.Create(true,bla,1000);
 mu.Resume;
end;

procedure Tform1.bla;
begin
if label1.Caption = '1' then label1.Caption := '2' else label1.Caption := '1';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
mu.Terminate;
end;

end.
Angehängt habe ich noch die kompletten Sources für Delphi (win32)

MarcoWarm 13. Okt 2005 11:16

Re: mein Timer
 
der TryExcept Block in der DoEvent-Routine könnte Probleme machen. Du fängst einfach alle Fehler ab und schmeißt sie in den Müll.

Außerdem ist der Timer nie genau. Denn zu deinem Intervall wird immer die Laufzeit des Events addiert.

supermuckl 13. Okt 2005 11:27

Re: mein Timer
 
das mit dem try except stimmt. mach ich raus

das die laufzeit addiert wird, weis ich (ist so gewollt)

supermuckl 13. Okt 2005 13:05

Re: mein Timer
 
//nachtrag

mein timer funzt ja eigentlich wie der echte TTimer, da ja folgender code:

Delphi-Quellcode:
if label1.Caption = '1' then label1.Caption := '2' else label1.Caption := '1';
sleep(20000);
den TTimer auch anhält ?!

kommt aufs selbe raus wenn ich den code in meinen timer eintrage.
oder hat da jemand was anderes rausbekommen eventuell?


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz