Code-Beispiel
TimerResolution
Lizenz: | Erster Autor: | Letzte Bearbeitung: |
k. A. | hhr | 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 hhr angelegt.
- Die aktuellste Version wurde am 07.09.2020 von hhr gespeichert.
|
|