另一个精准休眠延时函数链接

Sleep精准休眠延时函数1_不会强占线程

 

#SingleInstance Force
SetBatchLines -1
; 优点:精度精确到+0.03ms以内,缺点:SleepEx函数会强占线程,导致无法进行其它操作

/*
TimePeriod := 3 ; 尝试 7 或 3. 请参阅下面的注释.
; 在休眠持续时间一般向上取整到 15.6 ms 的个人电脑中, 尝试 TimePeriod:=7 来允许
; 稍短一点的休眠, 而尝试 TimePeriod:=3 或更小的值来允许最小可能的休眠.

DllCall("Winmm\timeBeginPeriod", "UInt", TimePeriod)  ; 作用于所有的应用程序, 而不只是脚本的 
; 只影响DllCall("Sleep", "UInt", 100),不影响自带Sleep命令
Return
*/

; SleepEx固定经过时间示例【以100ms为例】
F1::
计时()
SleepEx(100)
MsgBox % "SleepEx函数`n`n耗时:" 计时() " 毫秒"
Return

F2::
计时()
Sleep 100
; DllCall("Sleep", "UInt", 100)
MsgBox % "自带Sleep`n`n耗时:" 计时() " 毫秒"
Return


;  精确计时函数
计时() {
  Static
  if 开始=
    DllCall("QueryPerformanceFrequency", "Int64*", 频率), DllCall("QueryPerformanceCounter", "Int64*", 开始)
   else
    DllCall("QueryPerformanceCounter", "Int64*", 结束), 耗时:=(结束 - 开始)/频率*1000, 开始:=""
   Return 耗时
}


SleepEx(EndTime=0) {
  Static Freq, MulDivProc, init, timeBeginPeriod, timeEndPeriod
  if !init
    MulDivProc:=DllCall("GetProcAddress", "Ptr", DllCall("LoadLibrary", "Str", "Kernel32", "Ptr"), "AStr", "QueryPerformanceCounter", "Ptr")
    , timeBeginPeriod := DllCall("GetProcAddress", "Ptr", DllCall("LoadLibrary", "Str", "Winmm", "Ptr"), "AStr", "timeBeginPeriod", "Ptr")
    , timeEndPeriod := DllCall("GetProcAddress", "Ptr", DllCall("LoadLibrary", "Str", "Winmm", "Ptr"), "AStr", "timeEndPeriod", "Ptr")
    , DllCall("QueryPerformanceFrequency", "Int64P", Freq)
    , init=1
  DllCall(MulDivProc, "Int64P", Count1)
  , EndTime := (EndTime+Count1/Freq*1000)*Freq/1000
  , DllCall("QueryPerformanceCounter", "Int64*", t_current)
  , SleepTime:=Floor((EndTime-t_current)/Freq*1000-1) ; 最后1ms用轮循方式等待

  if (SleepTime>=1)
    DllCall(timeBeginPeriod, "UInt", SleepTime), DllCall("Sleep", "UInt", SleepTime), DllCall(timeEndPeriod, "UInt", SleepTime), DllCall("QueryPerformanceCounter", "Int64*", t_current)

  While (t_current < EndTime)
    DllCall("QueryPerformanceCounter", "Int64*", t_current)
}

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。