sleep の Autohotkey ドキュメントによると、 Sleep コマンドのタイミングは正確ではありません。
OS の時間管理システムの粒度により、Delay は通常、10 または 15.6 ミリ秒の最も近い倍数に切り上げられます (インストールされているハードウェアとドライバーの種類によって異なります)。たとえば、1 ~ 10 (両端を含む) の遅延は、ほとんどの Windows 2000/XP システムでは 10 または 15.6 に相当します。より短い遅延を実現するには、例を参照してください。
CPU に負荷がかかっている場合、実際の遅延時間は要求された時間よりも長くなる可能性があります。これは、OS がスクリプトに別のタイムスライスを与える前に、必要な各プロセスに CPU 時間のスライス (通常は 20 ミリ秒) を与えるためです。
これは、83 ミリ秒が約 100 であることによく一致します。その例のリンクに従うと、システム ハードウェア ベースの 10 または 15.6 ミリ秒の制限よりもスリープを短くするように設計された例に気付くでしょう。
SetBatchLines -1 ; Ensures maximum effectiveness of this method.
SleepDuration = 1 ; This can sometimes be finely adjusted (e.g. 2 is different than 3) depending on the value below.
TimePeriod = 3 ; Try 7 or 3. See comment below.
; On a PC whose sleep duration normally rounds up to 15.6 ms, try TimePeriod=7 to allow
; somewhat shorter sleeps, and try TimePeriod=3 or less to allow the shortest possible sleeps.
DllCall("Winmm\timeBeginPeriod", uint, TimePeriod) ; Affects all applications, not just this script's DllCall("Sleep"...), but does not affect SetTimer.
Iterations = 83
StartTime := A_TickCount
Loop %Iterations%
DllCall("Sleep", UInt, SleepDuration) ; Must use DllCall instead of the Sleep command.
DllCall("Winmm\timeEndPeriod", UInt, TimePeriod) ; Should be called to restore system to normal.
MsgBox % "Sleep duration = " . (A_TickCount - StartTime) / Iterations
これを適応させてみてください。私は始めました:
SetBatchLines -1 ; This makes your script run at the fastest speed possible, thereby increasing the likelihood that you'll get exactly what time you want to get.
SleepDuration = 1 ; This and the line before it should go at the beginning of your script.
DllCall("Winmm\timeBeginPeriod", uint, TimePeriod) ; this must be before the actual sleep DllCall
Iterations = 83
StartTime := A_TickCount ; You can delete this once you know it works
Loop %Iterations%
DllCall("Sleep", UInt, SleepDuration) ; Must use DllCall instead of the Sleep command.
DllCall("Winmm\timeEndPeriod", UInt, TimePeriod) ; Should be called to restore system to normal, after the middle DllCall.
MsgBox % "Sleep duration = " . (A_TickCount - StartTime) / IterationsMsgBox % "Sleep duration = " . (A_TickCount - StartTime) / Iterations ; Also delete this once you know it works