Seite 1 von 1

Timer Queues ab Windows 2000

Verfasst: 24.09.2008 03:56
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: