1

Тема: AHK: Потеря миллисекунд

В коде

start_time := A_TickCount
Sleep, 1000
elapsed_time := A_TickCount - start_time
MsgBox, прошло %elapsed_time% миллисекунд.

Теряются миллисекунды. Именно в этом коде msgbox показывает не 1к миллисекунд, а 997.
Если вставлять в цикл, потери более ощутимы. Как исправить?

2

Re: AHK: Потеря миллисекунд

Если нужна точность, можно корректировать время Sleep в каждой итерации цикла.

start_time := A_TickCount

Loop 10
   Sleep, 1000 - ( A_TickCount - start_time - 1000*(A_Index - 1) )

elapsed_time := A_TickCount - start_time
MsgBox, прошло %elapsed_time% миллисекунд.
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Потеря миллисекунд

start_time := A_TickCount

Loop 5
   Sleep, 1000 - ( A_TickCount - start_time - 1000*(A_Index - 1) )

elapsed_time := A_TickCount - start_time
MsgBox, прошло %elapsed_time% миллисекунд.

https://i.imgur.com/XR3jdhc.png

4

Re: AHK: Потеря миллисекунд

qqlexa, и что?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5 (изменено: qqlexa, 2018-05-25 19:37:47)

Re: AHK: Потеря миллисекунд

teadrinker, просто не могу понять почему существует такая задержка.

6

Re: AHK: Потеря миллисекунд

Так это погрешность одного Sleep, код просто не позволяет этим погрешностям накапливаться. Такая погрешность происходит из-за того, что точность способа, который используется для выделения времени, лежит в пределах 15ms, о чём написано в хелпе.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: Потеря миллисекунд

Есть разные способы измерять время точнее:
• QueryPerformanceCounter
• GetSystemTimePreciseAsFileTime (>= Win 8)
• MicroTimer.dll
Ну и SetBatchLines конечно установить.