Einzelnen Beitrag anzeigen

Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
441 Beiträge
 
Delphi 10.3 Rio
 
#5

Re: Eigene Timer Komponente aus der MMSystem

  Alt 1. Apr 2009, 07:37
Eine überarbeitete Variante ohne Probleme mit Sleep:

Delphi-Quellcode:
unit compFastTimer;

interface

uses
  Windows, SysUtils, MMSystem, Classes;

type
  TFastTimer = class(TComponent)
  private
    fTimerID: Longword;
    fInterval: Integer;

    pSelfData : PMMTimerData;
    FOnTimer: TNotifyEvent;
    fEnabled: Boolean;
    procedure SetInterval(Value: integer);
    function GetInterval: integer;
    procedure SetEnabled(const Value: Boolean);
  public
    constructor Create(Owner: TComponent); Override;
    destructor Destroy; override;

  published
    property Enabled: Boolean read fEnabled write SetEnabled;
    property Interval: integer read GetInterval write SetInterval;
    property OnTimer: TNotifyEvent read FOnTimer write FOnTimer;
  end;


implementation

Const
  TIME_KILL_SYNCHRONOUS = $0100;


procedure TimerCallback(uTimerID, uMessage: UINT; dwUser, dw1, dw2: DWORD) stdcall; pascal;
var
  ATimer: TFastTimer;
begin
  if dwUser <> 0 then
  begin
    ATimer := TFastTimer(dwUser);

    if Assigned(ATimer.fOnTimer) then
      ATimer.fOnTimer(ATimer);
  end;
end;



{ TFastTimer }

constructor TFastTimer.Create(Owner: TComponent);
begin
  inherited;
  fTimerID := 0;
  fInterval := 1000;
end;

destructor TFastTimer.Destroy;
begin
  Enabled := FALSE;
  inherited;
end;

function TFastTimer.GetInterval: integer;
begin
  Result := fInterval;
end;

procedure TFastTimer.SetInterval(Value: integer);
begin
  fInterval := Value;
end;



procedure TFastTimer.SetEnabled(const Value: Boolean);
begin
  if fEnabled <> Value then
  begin
    fEnabled := Value;
    if fEnabled then
    begin
      // Timer starten ...
      fTimerID := timeSetEvent(fInterval, 0, @TimerCallback, Integer(Self), TIME_PERIODIC Or TIME_KILL_SYNCHRONOUS);
    end
    else
    begin
     timeKillEvent(fTimerID);
     fTimerID := 0;
    end;
  end;
end;


end.
Das ganze könnte dann auch in die Tool-Palette installiert werden, und natürlich auch noch um die eine oder andere Eigenschaft (z.B.: Resolution) erweitert werden.

ACHTUNG!!! Updates der grafischen Oberfläche in OnTimer sind natürlich verboten!! (siehe MSDN-Library durchsuchentimeSetEvent ->Remarks). Mit MSDN-Library durchsuchenPostMessage(...) kann man aber aus OnTimer wieder in den Kontext des Hauptthreads kommen und dann von dort die Oberfläche aktuallisieren.
Whookie

Software isn't released ... it is allowed to escape!
  Mit Zitat antworten Zitat