找回密码
 加入
搜索
查看: 6014|回复: 7

[效率算法] [已解决]到底是API Sleep准确还是AU3内置Sleep准确?

  [复制链接]
发表于 2013-12-19 20:57:56 | 显示全部楼层 |阅读模式
本帖最后由 李岸 于 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 无限的意思

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2013-12-19 21:28:58 | 显示全部楼层
我好像记得sleep本身就不准
发表于 2013-12-19 21:32:01 | 显示全部楼层
楼主学习的很深入啊,笔记做的也不错。
发表于 2013-12-19 22:40:21 | 显示全部楼层
回复 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)
发表于 2013-12-19 22:47:42 | 显示全部楼层
如2# zch11230兄所说,Sleep本身就不准确,不管是API的Sleep,还是内置的Sleep,都存在少许的误差。
在使用DllCall调用Sleep API函数时,解析器要解析参数类型、返回值类型,Sleep API返回以后,还要创建数组,来存储API的返回值和参数,这一系列步骤会用去一部分时间,误差也许就是这样造成的。
与时间有关的函数,包括Sleep、TimerInit、TimerDiff等等,都没有绝对意义上的准确,只要误差不是太大,就都可以接受了,不要太认真~
另外,楼主兄的笔记很赞~
发表于 2013-12-20 03:18:34 | 显示全部楼层
回复 1# 李岸


    学习了,高
发表于 2013-12-24 09:17:03 | 显示全部楼层
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
用这个试试
发表于 2013-12-24 09:22:50 | 显示全部楼层
稍微实际一点好吧,提升Sleep的精确度对于实际应用的需求而言有多高?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-17 07:49 , Processed in 0.080428 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表