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
Antwort Antwort
Benutzerbild von DeddyH
DeddyH

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

Wie verwendet man CreateTimerQueueTimer richtig?

  Alt 10. Okt 2012, 11: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
Benutzerbild von DeddyH
DeddyH

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

AW: Wie verwendet man CreateTimerQueueTimer richtig?

  Alt 11. Okt 2012, 12:24
*Schieb*
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
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: Wie verwendet man CreateTimerQueueTimer richtig?

  Alt 11. Okt 2012, 12:58
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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: Wie verwendet man CreateTimerQueueTimer richtig?

  Alt 11. Okt 2012, 13:44
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.
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
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#5

AW: Wie verwendet man CreateTimerQueueTimer richtig?

  Alt 11. Okt 2012, 14:17
Ist das quasi etwas für die CodeLib?
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: Wie verwendet man CreateTimerQueueTimer richtig?

  Alt 11. Okt 2012, 14:42
In der Form? Ich denke, eher nicht, kann das aber noch etwas sauberer schreiben, falls es jemanden interessiert.
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
Antwort Antwort


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 11:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz