[crossplatform] Nano Seconds Timer

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
grabiller
Messages : 103
Inscription : lun. 10/sept./2012 11:55
Localisation : France - 89220 Rogny-Les-Septs-Ecluses
Contact :

[crossplatform] Nano Seconds Timer

Message par grabiller »

Bonjour,

Comme je fais quelques recherches 'crossplatform' pour mon projet, je me permets de poster ma solution pour avoir un timer précis à la nanoseconde fonctionnant sur Windows, Linux et Mac OS X:

N'hésitez pas à m'indiquer si vous avez un soucis avec. Je l'ai testé sur:
- Windows 7 - 64bit
- Linux Ubuntu 12.04.1 - 64bit
- Mac OSX Lion 10.7.2 - 64bit

Code : Tout sélectionner

; ============================================================================
;  IMPORT
; ============================================================================
;{
CompilerSelect #PB_Compiler_OS
    
  ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ;  WINDOWS
  ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  CompilerCase #PB_OS_Windows
    ; NOP
    
  ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ;  LINUX
  ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  CompilerCase #PB_OS_Linux
    #CLOCK_MONOTONIC = 1
    Structure timespec_t
      tv_sec.i
      tv_nsec.i
    EndStructure
    ImportC ""
      clock_getres.i ( clock_id.i, *res.timespec_t )
      clock_gettime.i( clock_id.i, *tp.timespec_t  )
    EndImport
    
  ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ;  MAC OS
  ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  CompilerCase #PB_OS_MacOS
    Structure mach_timebase_info_t
      numer.l
      denom.l
    EndStructure
    ImportC ""
      mach_timebase_info.i( *info.mach_timebase_info_t )
      mach_absolute_time.q()
    EndImport

CompilerEndSelect
;}


; ============================================================================
;  GLOBALS
; ============================================================================
;{
Global s_qpc_start.d
Global s_qpc_res  .d
;}


; ============================================================================
;  PROCEDURES
; ============================================================================
;{
; ----------------------------------------------------------------------------
;  raaQPCInitOnce
; ----------------------------------------------------------------------------
Procedure raaQPCInitOnce()
  
  CompilerSelect #PB_Compiler_OS
      
    ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ;  WINDOWS
    ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ;{
    CompilerCase #PB_OS_Windows
      
      Protected v.q = 0
      
      If Not QueryPerformanceFrequency_( @v )
        MessageRequester( "Performance Counter", "High-Resolution Performance Counter NOT Supported!" )
        End
      EndIf
      
      If Not v
        MessageRequester( "Performance Counter", "High-Resolution Performance Counter NOT Supported!" )
        End
      EndIf
      
      s_qpc_res = 1.0/v
      
      QueryPerformanceCounter_( @v )
      
      s_qpc_start = v*s_qpc_res
    ;}
      
    ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ;  LINUX
    ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ;{
    CompilerCase #PB_OS_Linux
      
      Protected v.timespec_t
      
      If clock_getres( #CLOCK_MONOTONIC, @v )
        MessageRequester( "Performance Counter", "High-Resolution Performance Counter NOT Supported!" )
        End
      EndIf
      
      s_qpc_res = 1.0e-9*v\tv_nsec
      
      If clock_gettime( #CLOCK_MONOTONIC, @v )
        MessageRequester( "Performance Counter", "High-Resolution Performance Counter NOT Supported!" )
        End
      EndIf
      
      s_qpc_start = v\tv_sec + v\tv_nsec*s_qpc_res
    ;}
      
      
    ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ;  MAC OS
    ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ;{
    CompilerCase #PB_OS_MacOS
      
      Protected v.mach_timebase_info_t
      
      mach_timebase_info( @v ) ; returned error ?
      
      s_qpc_res = 1.0e-9 * v\numer / v\denom
      
      s_qpc_start =  mach_absolute_time()*s_qpc_res
    ;}
    
  CompilerEndSelect
  
EndProcedure

; ----------------------------------------------------------------------------
;  raaQPCGetAppTime
; ----------------------------------------------------------------------------
Procedure.d raaQPCGetAppTime()
  
  CompilerSelect #PB_Compiler_OS
      
    ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ;  WINDOWS
    ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ;{
    CompilerCase #PB_OS_Windows
    
      Protected time.q = 0
      
      QueryPerformanceCounter_( @time )
      
      ProcedureReturn time*s_qpc_res - s_qpc_start
    ;}
      
    ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ;  LINUX
    ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ;{
    CompilerCase #PB_OS_Linux
    
      Protected v.timespec_t
      
      clock_gettime( #CLOCK_MONOTONIC, @v )
      
      ProcedureReturn v\tv_sec + v\tv_nsec*s_qpc_res - s_qpc_start
    ;}
      
    ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ;  MAC OS
    ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ;{
    CompilerCase #PB_OS_MacOS
    
      ProcedureReturn mach_absolute_time()*s_qpc_res - s_qpc_start
    ;}
      
  CompilerEndSelect
  
EndProcedure
;}


; ============================================================================
;  MAIN
; ============================================================================

raaQPCInitOnce()

Delay( 1000 )

MessageRequester( "Query Performance Counter", "Delay after ~1sec : "+ StrD(raaQPCGetAppTime()) )

End


; ============================================================================
;  EOF
; ============================================================================
Cordialement,
Guy.
guy rabiller | radfac founder / ceo | raa.tel | raafal.org
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: [crossplatform] Nano Seconds Timer

Message par Backup »

Merci , :)

ce sujet avait deja été abordé

ici : http://www.purebasic.fr/english/viewtopic.php?t=13410

et ici
http://www.purebasic.fr/french/viewtopi ... mer+precis

:)

mais pas forcement pour tout les System :)
Avatar de l’utilisateur
grabiller
Messages : 103
Inscription : lun. 10/sept./2012 11:55
Localisation : France - 89220 Rogny-Les-Septs-Ecluses
Contact :

Re: [crossplatform] Nano Seconds Timer

Message par grabiller »

Effectivement, mais pas de manière crossplatform :wink: .
guy rabiller | radfac founder / ceo | raa.tel | raafal.org
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: [crossplatform] Nano Seconds Timer

Message par Backup »

grabiller a écrit :Effectivement, mais pas de manière crossplatform :wink: .
oui , c'est pour ça que je te dis Merci , :)

sinon je t'aurai envoyé te faire voir ailleurs :lol:
Avatar de l’utilisateur
grabiller
Messages : 103
Inscription : lun. 10/sept./2012 11:55
Localisation : France - 89220 Rogny-Les-Septs-Ecluses
Contact :

Re: [crossplatform] Nano Seconds Timer

Message par grabiller »

Je t'ai répondu avant que tu rajoutes

"mais pas forcement pour tout les System :)"

dans ton message.

Désolé :wink:
guy rabiller | radfac founder / ceo | raa.tel | raafal.org
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: [crossplatform] Nano Seconds Timer

Message par Backup »

en fait j'avais ajouté juste avant de voir ta reponse :)

je reedite souvent mes posts , avant de me repondre vaut mieux attendre un peu :lol:

je suis du genre a me remettre en question , trop souvent, au point que j'arrive a changer d'avis avant la fin de la rédaction d'un message :lol: c'est dire :)
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [crossplatform] Nano Seconds Timer

Message par Ar-S »

Micheline et Germaine, non mais c'est pas bientôt terminé ! :mrgreen: :mrgreen: :mrgreen:

Merci pour cette contribution grabiller.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre