Seite 1 von 1

HighRes - Timer

Verfasst: 21.12.2008 18:22
von cxAlex
Da ElapsedMilliseconds ziemlich ungenau ist (wie schon öfter hier diskutiert) hab ich mir anhand einiger Code-Snippets aus dem Board ein Include für einen HighRes Timer geschrieben.

Einfach einbinden und statt ElapsedMilliseconds() immer GetTimeMS() verwenden, sollte keine Probleme geben.

Code: Alles auswählen

; ------------------------------------------------------------------------------------
; HighRes - Timer
; PB 4.x
; Alexander Aigner
;
; Funktionen:
;
; GetTimeMS()
; ------------------------------------------------------------------------------------

Prototype.l HR_Time()

; ------------------------------------------------------------------------------------
; Interne Variablen
; ------------------------------------------------------------------------------------

Structure _HR_Internal
  TicksPerSecond.l
  Frequency.q
  StartTime.q
EndStructure

Define _HR._HR_Internal
Global GetTimeMS.HR_Time

; ------------------------------------------------------------------------------------
; Interne Proceduren
; ------------------------------------------------------------------------------------

Procedure.l _HR_InitTime()
  Shared _HR._HR_Internal
  With _HR
    If Not QueryPerformanceFrequency_(@\Frequency)
      ProcedureReturn 0
    Else
      QueryPerformanceCounter_(@\StartTime)
      \TicksPerSecond = 1000 ; 1000 = Millisekunden
      ProcedureReturn 1
    EndIf
  EndWith
EndProcedure

Procedure.l _HR_Get()
  Shared _HR._HR_Internal
  Protected currentTime.q
  With _HR
    QueryPerformanceCounter_(@currentTime.q)
    ProcedureReturn (currentTime-\StartTime)*\TicksPerSecond/\Frequency
  EndWith
EndProcedure

Procedure _HR_oldPC_or_Linux()
  ProcedureReturn ElapsedMilliseconds()
EndProcedure

; ------------------------------------------------------------------------------------
; Initialisierung
; ------------------------------------------------------------------------------------

CompilerIf #PB_Compiler_OS <> #PB_OS_Windows
  GetTimeMS = @_HR_oldPC_or_Linux()
CompilerElse
  If _HR_InitTime()
    GetTimeMS = @_HR_Get()
  Else
    GetTimeMS = @_HR_oldPC_or_Linux()
  EndIf
CompilerEndIf

Verfasst: 21.12.2008 19:29
von Fluid Byte
Ist da jetzt grundlegend etwas anders als an dem Code hier?

http://www.purebasic.fr/german/viewtopic.php?t=9938

Verfasst: 21.12.2008 19:33
von cxAlex
Habs mir jetzt nciht genauer angeschaut, aber im Prinzip das gleiche.
Bei mir wird halt überprüft ob der HighRes - Timer überhaupt vorhanden ist, (kann bei älteren PCs der Fall sein das es den noch nicht gibt) und ob ein anderes OS als Windows genutzt wird.

Verfasst: 21.12.2008 19:48
von Kaeru Gaman
allerdings prüft dein code das zur compilezeit, was es eher ad absurdum führt.

ich würde mir wünschen, die prüfung zur laufzeit erfolgen zu lassen,
damit ein auf meinem rechner compilierter code auf nem älteren rechner läuft und umgekehrt.

Verfasst: 21.12.2008 19:50
von cxAlex

Code: Alles auswählen

CompilerIf #PB_Compiler_OS <> #PB_OS_Windows
  GetTimeMS = @_HR_oldPC_or_Linux()
CompilerElse
  If _HR_InitTime()
    GetTimeMS = @_HR_Get()
  Else
    GetTimeMS = @_HR_oldPC_or_Linux()
  EndIf
CompilerEndIf 
Du irrst dich. Zur Compiler-Zeit wird nur geprüft ob das OS Windows ist. Die Prüfung ob der Timer vorhanden ist geschieht zur Laufzeit.

Verfasst: 21.12.2008 19:57
von Kaeru Gaman
ah! ok... hab ich mich vom CompilerIf ablenken lassen.