[已解决]到底是API Sleep准确还是AU3内置Sleep准确?
本帖最后由 李岸 于 2014-5-26 14:30 编辑以下是我学习P版的书整理的学习笔记:
那么AU3是不支持多线程的,API的Sleep函数在kernel.dll中,功能是使调用者线程进入睡眠状态,不是调用进程进入睡眠状态。
API的返回类型,VOID对应AU3中的NONE;即不能把函数的返回值,看作一个有意义的值。
那AU3的Sleep只支持24天,API的Sleep支持48天的的睡眠或永久。
那么进行一个有意思的比对,来测试一下API的Sleep与AU3内置的Sleep,更加准确呢?
代码:
$fTimer = TimerInit()
DllCall("kernel32.dll", "none", "Sleep", "dword", 1000)
ConsoleWrite("API的Sleep:" & TimerDiff($fTimer) & @CRLF)
$fTimer2 = TimerInit()
Sleep(1000)
ConsoleWrite("AU3内置Sleep:" & TimerDiff($fTimer2) & @CRLF)
经过多次测试发现,后者更准确误差在±10毫秒之间,而前者在±20毫秒之间。这种情况是为什么呢?
那颠倒一下两个代码的位置:
这又是API的Sleep更精确了。
这是什么情况呢?不求现在就懂,请把答案留给以后的我,3Q!
生词:
Timer 定时器。
Milli 千分之一;MilliSeconds千分之一秒,既毫秒。
Completion 完成,结束。
INFINITE 无限的意思 我好像记得sleep本身就不准 楼主学习的很深入啊,笔记做的也不错。 回复 1# 李岸
TimerDiff得到的是 当脚本运行到ConsoleWrite时的时间差,跟解释器处理脚本的速度有关系.
稍加修改你的代码,你再试试,误差在几毫秒内的$fTimer = TimerInit()
DllCall("kernel32.dll", "none", "Sleep", "dword", 1000)
Local $fD1 = TimerDiff($fTimer)
ConsoleWrite("API的Sleep:" & $fD1 & @CRLF)
$fTimer2 = TimerInit()
Sleep(1000)
Local $fD2 = TimerDiff($fTimer2)
ConsoleWrite("AU3内置Sleep:" & $fD2 & @CRLF) 如2# zch11230兄所说,Sleep本身就不准确,不管是API的Sleep,还是内置的Sleep,都存在少许的误差。
在使用DllCall调用Sleep API函数时,解析器要解析参数类型、返回值类型,Sleep API返回以后,还要创建数组,来存储API的返回值和参数,这一系列步骤会用去一部分时间,误差也许就是这样造成的。
与时间有关的函数,包括Sleep、TimerInit、TimerDiff等等,都没有绝对意义上的准确,只要误差不是太大,就都可以接受了,不要太认真~
另外,楼主兄的笔记很赞~ 回复 1# 李岸
学习了,高 Func _WinAPI_ZwDelayExecution($iMicroSeconds,$hDll=False)
Local $hStruct, $bLoaded
If Not $hDll Then
$hDll=DllOpen("ntdll.dll")
$bLoaded=True
EndIf
$hStruct=DllStructCreate("int64 time;")
DllStructSetData($hStruct,"time",-1*($iMicroSeconds*10))
DllCall($hDll,"dword","ZwDelayExecution","int",0,"ptr",DllStructGetPtr($hStruct))
If $bLoaded Then DllClose($hDll)
EndFunc
用这个试试 稍微实际一点好吧,提升Sleep的精确度对于实际应用的需求而言有多高?
页:
[1]