Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Code-Beispiel

Code-Beispiele » System

TimerResolution

Lizenz:Erster Autor:Letzte Bearbeitung:
k. A.Mitgliedhhr 07.09.2020

Wenn man im FreeBASIC-Ordner nach NtQueryTimerResolution oder NtSetTimerResolution sucht, wird libntdll.dll.a angezeigt. Diese Funktionen sind in keiner bi-Datei vorbereitet, sodass sie im Programm deklariert werden müssen.

Das Programm kann in der IDE ausprobiert werden. Weil manche Programme (Firefox, Oracle VirtualBox) die Auflösung des Systemzeitgebers verstellen, sollten alle anderen Programme geschlossen sein.

Das Programm wird ohne Parameter gestartet. Es erzeugt eine zweite Instanz mit Parameter 1. Die zweite Instanz erzeugt eine dritte Instanz mit Parameter 2. Die Parameter bestimmen dann die Programmfunktionen.
Nach einer kleinen Änderung kann auch die dritte Instanz von der ersten Instanz aufgerufen werden.

Es werden drei Konsolenfenster gestartet, die man auf dem Bildschirm geeignet platzieren kann. Im Hauptfenster kann man die gewünschte Auflösung einstellen und beobachten, was in den beiden anderen Fenstern geschieht.

Wenn man das Hauptfenster schließt, wird die Auflösung automatisch auf den Standardwert zurückgestellt.

Declare Function NtQueryTimerResolution Lib "ntdll" Alias "NtQueryTimerResolution"(_
Byref MinimumResolution As Ulong,_
Byref MaximumResolution As Ulong,_
Byref ActualResolution As Ulong) As Ulong

Declare Function NtSetTimerResolution Lib "ntdll" Alias "NtSetTimerResolution"(_
Byval DesiredResolution As Ulong,_
Byval SetResolution As Boolean,_
Byref CurrentResolution As Ulong) As Ulong

Dim As String commandline

If Len(Command(1)) = 0 Then
   commandline =_
   "Start" & Chr(32,34) & "QueryTimerResolution" & Chr(34,32,34) & Command(0) & Chr(34,32) & "1"
   Shell commandline
End If

If Command(1) = "1" Then
   commandline =_
   "Start" & Chr(32,34) & "TestTimerResolution" & Chr(34,32,34) & Command(0) & Chr(34,32) & "2"
   Shell commandline
End If

Dim As Ulong min,max,actual,desired,current

If Len(Command(1)) = 0 Then
   Do
      NtQueryTimerResolution(min,max,actual)
      Print "MinimumResolution:";min/10000;" ms"
      Print "MaximumResolution:";max/10000;" ms"
      Print " ActualResolution:";actual/10000;" ms"
      Input "DesiredResolution: ",desired
      Print String(29,"-")
      desired = desired*10000
      NtSetTimerResolution(desired,True,current)
   Loop
End If

If Command(1) = "1" Then
   Do
      NtQueryTimerResolution(min,max,actual)
      Print "ActualResolution:";actual/10000;" ms"
      Sleep 500
      Cls
   Loop
End If

If Command(1) = "2" Then
   Dim As Long i
   Dim As Double t0,t1,ts
   Do
      t0=Timer
      Sleep 1000
      t1=Timer
      Print Spc(8);
      Print Using "Sleep 1000:##.####s";t1-t0

      t0=Timer
      Sleep 1000,1
      t1=Timer
      Print Spc(6);
      Print Using "Sleep 1000,1:##.####s";t1-t0

      ts=0
      For i=1 To 1000
         t0=Timer
         Sleep 1
         t1=Timer
         ts=ts+t1-t0
      Next i
      Print Spc(4);
      Print Using "1000 x Sleep 1:##.####s";ts

      ts=0
      For i=1 To 1000
         t0=Timer
         Sleep 1,1
         t1=Timer
         ts=ts+t1-t0
      Next i
      Print Spc(2);
      Print Using "1000 x Sleep 1,1:##.####s";ts

      Print String(27,"-")
   Loop
End If

End
'

Zusätzliche Informationen und Funktionen
  • Das Code-Beispiel wurde am 05.09.2020 von Mitgliedhhr angelegt.
  • Die aktuellste Version wurde am 07.09.2020 von Mitgliedhhr gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen