High resolution replacement for Sleep
#3
Revised SleepXX

This version includes code written by Stuart McLachlan to determine CPUBaseFreq programmatically.

So we now have our machine doing the 'dirty work'.
Code:
#COMPILE EXE
#DIM ALL
#break on
#INCLUDE "win32api.inc"

' SOURCE CODE:

Macro SetHiRes
  MacroTemp Time
  Dim Time As TIMECAPS
  TimeGetDevCaps( Time, SizeOf(Time) )
  TimeBeginPeriod(Time.wPeriodMin)
  'Sleep 16 ' Pre Windows 10
End Macro

Macro RevokeHiRes
  MacroTemp Time
  Dim Time As TIMECAPS
  TimeGetDevCaps( Time, SizeOf(Time) )
  TimeEndPeriod(Time.wPeriodMin)
End Macro

GLOBAL CPUBaseFreq AS QUAD

FUNCTION GetBaseCPUFreq() AS QUAD ' By Stuart McLachlan
  LOCAL retval , hkey AS DWORD
  LOCAL MHz AS DWORD
  retval = RegOpenKeyEx( %HKEY_LOCAL_MACHINE,"HARDWARE\DESCRIPTION\System\CentralProcessor\0"  ,0,%key_query_value,hkey)
  retval = regqueryvalueex(hkey,"~Mhz",0,%REG_DWORD,MHZ,4)
  retval = regclosekey(hkey)
  FUNCTION = MHZ * 10 ^6
END FUNCTION

Sub SleepXX( ByVal n As Double )
  Local qTarget, qTimeNow As Quad
  Tix qTimeNow
  qTarget = qTimeNow + n*CPUBaseFreq*0.001
  If n <= 3 then
    Do : Tix qTimeNow : Loop Until qTimeNow >= qTarget ' Class A amplifier analogy
  Else
    ' Class B amplifier analogy followed by Classs A amplifier analogy
    Sleep ( n-3 ) : Do : Tix qTimeNow  : Loop Until qTimeNow >= qTarget
  End If
End Sub

' ====================

' EXAMPLE USAGE:

FUNCTION PBMAIN () AS LONG
Local i as Long
Local qTime As Quad

  CPUBaseFreq = GetBaseCPUFreq
 
  SetHiRes

  Tix qTime
    SleepXX(0.25)
  Tix End qTime
  Print "Quarter of a millisecond:";format$(qTime/CPUBaseFreq*10^3," ####.######");" ms"
  Print

  Tix qTime
    SleepXX(2000)
  Tix End qTime
  Print "2 seconds:";Format$(qTime/CPUBaseFreq*10^3, "####.######");" ms"
  Print

  Tix qTime
    SleepXX(1234)
  Tix End qTime
  Print "Silly:";ForMat$(qTime/CPUBaseFreq*10^3, "####.######");" ms"
  Print

  For i = 1 to 30
    Tix qTime
      SleepXX(i)
    Tix End qTime
    Print i;" ";Format$(qTime/CPUBaseFreq*10^3, "####.######");" ms"
  Next 

  RevokeHiRes

  WaitKey$

END FUNCTION
Reply


Messages In This Thread
RE: High resolution replacement for Sleep - by David Roberts - 14.09.2025, 09:11 AM

Forum Jump:


Users browsing this thread: 1 Guest(s)