AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Wie verwendet man CreateTimerQueueTimer richtig?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie verwendet man CreateTimerQueueTimer richtig?

Ein Thema von DeddyH · begonnen am 10. Okt 2012 · letzter Beitrag vom 11. Okt 2012
 
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#1

Wie verwendet man CreateTimerQueueTimer richtig?

  Alt 10. Okt 2012, 10:59
Hallo,

timeSetEvent gilt ja als veraltet, daher soll man CreateTimerQueueTimer verwenden. Delphi-Beispiele sind schwer zu finden, daher habe ich ein wenig probiert. Meine Grundidee war eine Klasse, die ein MessageOnly-Window anlegt, an welches sie dann Nachrichten schicken lässt, die im Callback des Timers gesendet werden. Dadurch kann der Timer durchlaufen und versendet eben nur Nachrichten, die Klasse räumt evtl. aufgelaufene Nachrichten ab und ruft einen ggf. zugewiesenen Eventhandler auf. Meine Frage: kann man das so machen, oder habe ich das nicht richtig verstanden und muss irgendwann mit blöden Seiteneffekten rechnen? Hier mal ein Beispiel für so eine Klasse:
Delphi-Quellcode:
const
  MYMESSAGE = WM_USER + 42;

type
  TTimerTestClass = class
  private
    FWnd: HWnd;
    FOnTimer: TNotifyEvent;
    FTimer: THandle;
    procedure ClearMessageQueue;
    procedure DoOnTimer(var Msg: TMessage);
  public
    constructor Create;
    destructor Destroy; override;
    procedure StartTimer;
    procedure StopTimer;
    property OnTimer: TNotifyEvent read FOnTimer write FOnTimer;
  end;

implementation

procedure TTimerTestClass.ClearMessageQueue;
var
  Msg: TMsg;
begin
  while PeekMessage(Msg, FWnd, MYMESSAGE, MYMESSAGE, PM_REMOVE) do;
end;

constructor TTimerTestClass.Create;
begin
  FWnd := AllocateHWnd(DoOnTimer);
end;

destructor TTimerTestClass.Destroy;
begin
  StopTimer;
  DeallocateHWnd(FWnd);
  inherited;
end;

procedure TTimerTestClass.DoOnTimer(var Msg: TMessage);
begin
  ClearMessageQueue;
  if Assigned(FOnTimer) then
    FOnTimer(self);
end;

procedure WaitOrTimer(lpParameter: Pointer; TimerOrWaitFired: Boolean); stdcall;
var
  Test: TTimerTestClass;
begin
  Test := TTimerTestClass(lpParameter);
  if Assigned(Test) then
    PostMessage(Test.FWnd, MYMESSAGE, 0, 0);
end;

procedure TTimerTestClass.StartTimer;
begin
  if not CreateTimerQueueTimer(FTimer, 0, WaitOrTimer, self, 0, 50,
    WT_EXECUTELONGFUNCTION) then
    FTimer := 0;
end;

procedure TTimerTestClass.StopTimer;
begin
  if FTimer <> 0 then
    begin
      DeleteTimerQueueTimer(0, FTimer, 0);
      FTimer := 0;
    end;
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:07 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