@theCube
Das war natürlich nur ein "schlechtes Beispiel" da ich diesmal "Beschwerden" über die Größe der realen Routinen vermeiden wollte.
Mit der Geschwindigkeit der Debug-Ausgabe hat das aber nichts zu tun (sonst würde die While-Wend-Schleife ohne die Debug-Ausgabe ja abgebrochen werden).
Habe zwischenzeitlich mal die andere Lösung mit While-Wend getestet.
Scheint zu funktionieren!
Code: Alles auswählen
Define TimerResolution.TIMECAPS
Global Dim TimerHandles(15)
Global Dim TimerProcedures(15)
Procedure Timer_Init()
Shared TimerResolution
If timeGetDevCaps_(@TimerResolution, SizeOf(TIMECAPS)) = #TIMERR_NOERROR
If timeBeginPeriod_(TimerResolution\wPeriodMin) = #TIMERR_NOERROR
ProcedureReturn #True
EndIf
EndIf
ProcedureReturn #False
EndProcedure
Procedure Timer_End()
Protected I
Shared TimerResolution
timeEndPeriod_(TimerResolution\wPeriodMin)
For I = 0 To 15
If TimerHandles(I)
timeKillEvent_(TimerHandles(I))
EndIf
Next
EndProcedure
Procedure Timer_Callback(TimerHandle, Message, TimerID, wParam, lParam)
If TimerProcedures(TimerID)
CallFunctionFast(TimerProcedures(TimerID))
EndIf
EndProcedure
Procedure TimerStart(TimerID, Delay, ProcAddr)
If TimerID > 15 Or TimerID < 0 : ProcedureReturn #False : EndIf
If TimerHandles(TimerID)
timeKillEvent_(TimerHandles(TimerID))
EndIf
TimerProcedures(TimerID) = ProcAddr
TimerHandles(TimerID) = timeSetEvent_(Delay, 0, @Timer_Callback(), TimerID, #TIME_PERIODIC)
ProcedureReturn TimerHandles(TimerID)
EndProcedure
Procedure TimerStop(TimerID)
If TimerID > 15 Or TimerID < 0 : ProcedureReturn #False : EndIf
If TimerHandles(TimerID)
timeKillEvent_(TimerHandles(TimerID))
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure TimerGetMaxRes()
Shared TimerResolution
ProcedureReturn TimerResolution\wPeriodMax
EndProcedure
Procedure TimerGetMinRes()
Shared TimerResolution
ProcedureReturn TimerResolution\wPeriodMin
EndProcedure
Procedure mytimer1()
Shared hoehe
Debug "Timer 1"
If hoehe = 1000: hoehe = 100: EndIf
Beep_(hoehe,100)
hoehe+100
EndProcedure
Procedure mytimer2()
Beep_(1800,5)
Debug "Timer 2"
EndProcedure
Procedure mytimer3()
Beep_(1800,100)
Debug "Timer 3"
EndProcedure
Procedure mytimer4()
Beep_(800,100)
Debug "Timer 4"
EndProcedure
Procedure TestProc()
While 0=0
Wend
EndProcedure
Timer_Init()
hWnd = OpenWindow(0, (GetSystemMetrics_(#SM_CXSCREEN)-200)/2,(GetSystemMetrics_(#SM_CYSCREEN)-277)/2, 400, 360, "High Resolution Timer by Danilo", #PB_Window_SystemMenu|#PB_Window_SizeGadget)
TimerStart(0, 1000, @mytimer1())
TimerStart(1, 200, @mytimer2())
TimerStart(2, 2000, @mytimer3())
TimerStart(3, 600, @mytimer4())
Repeat
EventID.l=WaitWindowEvent()
; IF LeftMouseButton pressed...
If EventID = #WM_LBUTTONDOWN
TimerStop(1): TimerStop(2): TimerStop(3)
EndIf
TestProc()
; pressed CloseButton or ALT+F4 ??
If EventID = #PB_Event_CloseWindow
Quit = 1
EndIf
Until Quit = 1
Timer_End()
Hoffe nur, das mich nicht noch weitere Überraschungen erwarten
Gruß
Daffy