HighRes - Timer

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
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

HighRes - Timer

Beitrag 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
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Ist da jetzt grundlegend etwas anders als an dem Code hier?

http://www.purebasic.fr/german/viewtopic.php?t=9938
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag 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.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag 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.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ah! ok... hab ich mich vom CompilerIf ablenken lassen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten