Timer Queues ab Windows 2000

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Timer Queues ab Windows 2000

Beitrag von ts-soft »

Dies ist eine Übersetzung eines C Beispieles von Microsoft. Das Original,
sowie weitere Infos gibts hier

PB ab 4.30 (auch 64-Bit Version)
Windows only!

Code: Alles auswählen

EnableExplicit

Import "kernel32.lib"
  CreateTimerQueue()
  CreateTimerQueueTimer(*phNewTimer, TimerQueue.i, *Callback, *Parameter, DueTime.i, Period.i, Flags.l)
  DeleteTimerQueue(TimerQueue.i)
EndImport

Global gDoneEvent.i

OpenConsole()

Procedure TimerRoutine(*lpParam.Integer, TimerOrWaitFired.i)
  If *lpParam = 0
    PrintN("TimerRoutine *lpParam is #NULL")
  Else
    PrintN("Timer routine called. Parameter is " + Str(*lpParam\i))
  EndIf
  SetEvent_(gDoneEvent)
EndProcedure

Procedure Main()
  Protected hTimer.i
  Protected hTimerQueue.i
  Protected arg.i = 123
 
  ; Use an event object To track the TimerRoutine execution
  gDoneEvent = CreateEvent_(#Null, #True, #False, #Null)
  If Not gDoneEvent
    PrintN("CreateEvent failed " + Str(GetLastError_()))
    ProcedureReturn 1
  EndIf
 
  ; Create the timer queue
  hTimerQueue = CreateTimerQueue()
  If Not hTimerQueue
    PrintN("CreateTimerQueue failed " + Str(GetLastError_()))
    ProcedureReturn 2
  EndIf
 
  ; Set a timer To call the timer routine in 10 seconds
  If Not CreateTimerQueueTimer(@hTimer, hTimerQueue, @TimerRoutine(), @arg, 10000, 0, 0)
    PrintN("CreateTimerQueueTimer failed " + Str(GetLastError_()))
    ProcedureReturn 3
  EndIf
 
  ; TODO: Do other useful work here
  PrintN("Call timer routine in 10 seconds...")

  ; Wait For the timer-queue thread To complete using an event
  ; object. The thread will signal the event at that time. 
 
  If WaitForSingleObject_(gDoneEvent, #INFINITE) <> #WAIT_OBJECT_0
    PrintN("WaitForSingleObject failed " + Str(GetLastError_()))
  EndIf
  CloseHandle_(gDoneEvent)  
   
  ; Delete all timers in the timer queue
  If Not DeleteTimerQueue(hTimerQueue)
    PrintN("DeleteTimerQueue failed " + Str(GetLastError_()))
  EndIf
 
  ProcedureReturn 0 
EndProcedure

Debug Main()
PrintN("")
Print("press return to end ")
Input()
CloseConsole()
Diese Timerfunktionen ersetzen den MultiMedia Timer und werden von
Microsoft statt dessen empfohlen.

Vielleicht kanns ja einer gebrauchen :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild