Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Wie verwendet man CreateTimerQueueTimer richtig? (https://www.delphipraxis.net/170918-wie-verwendet-man-createtimerqueuetimer-richtig.html)

DeddyH 10. Okt 2012 10:59

Wie verwendet man CreateTimerQueueTimer richtig?
 
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;

DeddyH 11. Okt 2012 11:24

AW: Wie verwendet man CreateTimerQueueTimer richtig?
 
*Schieb* :duck:

Zacherl 11. Okt 2012 11:58

AW: Wie verwendet man CreateTimerQueueTimer richtig?
 
Sieht soweit gut aus meiner Meinung nach. Auch wenn ich persönlich für einfache Timer meistens einen Thread mit WaitForSingleObject bzw. Sleep irgendwie handlicher finde.

DeddyH 11. Okt 2012 12:44

AW: Wie verwendet man CreateTimerQueueTimer richtig?
 
Danke Dir. Das Ganze ist nur ein Teil meiner BassPlayer-Klasse (ich weiß, es gibt schon etliche davon, aber die meisten sind mir zu überladen oder bieten nicht das, was ich brauche). Im Visualisierungs-Beispiel wurde TimeSetEvent benutzt, nach einem Blick ins MSDN bin ich dann halt auf CreateTimerQueue gestoßen, das war recht einfach zu implementieren, wie man oben sieht.Bislang funktioniert das auch ohne Probleme, ich wollte nur sichergehen, dass ich keinen Denkfehler mache.

QuickAndDirty 11. Okt 2012 13:17

AW: Wie verwendet man CreateTimerQueueTimer richtig?
 
Ist das quasi etwas für die CodeLib?

DeddyH 11. Okt 2012 13:42

AW: Wie verwendet man CreateTimerQueueTimer richtig?
 
In der Form? Ich denke, eher nicht, kann das aber noch etwas sauberer schreiben, falls es jemanden interessiert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:26 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