1 (изменено: pwch, 2023-03-09 08:53:50)

Тема: AHK: Не корректная работа sleep

При выполнении sleep 100, 1100, 2100 и тд происходит задержка в 0.11 1.11 2.11 и тд, если поменять 100 на 99 то задержка составляет 0.9.
Как это исправить?

2

Re: AHK: Не корректная работа sleep

Это может быть связано с тем, что функция Sleep в AutoHotkey имеет ограничение точности до 10-15 миллисекунд. Поэтому задержки, указанные в 100, 1100 и 2100 миллисекундах, могут привести к некоторому округлению и неточности в результате.

Если вам нужно точное время задержки, вы можете использовать другие методы, например, функцию SetTimer с низким разрешением таймера или использовать библиотеки с высоким разрешением времени, такие как QueryPerformanceCounter.

Если точность не является критически важной, вы можете попробовать использовать более точный интервал задержки, например, 99 миллисекунд вместо 100 миллисекунд. Это может уменьшить ошибку округления и сделать вашу задержку более точной.

3

Re: AHK: Не корректная работа sleep

size222
Похоже на ответ из ChatGPT. Как использовать QueryPerformanceCounter вместо Sleep? Что за функция "SetTimer с низким разрешением таймера" и как её использовать вместо Sleep?

size222 пишет:

Если точность не является критически важной, вы можете попробовать использовать более точный интервал задержки

Какой смысл в этой фразе?

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

4

Re: AHK: Не корректная работа sleep

Можете в таком случае подсказать как через QueryPerformanceCounter реализовать альтернативу sleep потому что я не смог разобраться как он работает.
В идеале сразу готовый альтернативный код представленный коду ниже.

sendinput {a}
sleep 100
sendinput {b}

5 (изменено: ypppu, 2023-03-09 19:40:54)

Re: AHK: Не корректная работа sleep

pwch, в AutoHotkey по умолчанию присутствуют всякие-разные встроенные задержки, которые первоначально не равны нулю, и их можно настраивать соответствующими командами:

  • SetKeyDelay

  • SetControlDelay

  • SetMouseDelay

  • SetWinDelay

  • SetBatchLines

Прочитайте соответствующие статьи в справке, уверен, много прояснится.

6

Re: AHK: Не корректная работа sleep

ypppu, боюсь, всё это не имеет отношения к вопросу.

pwch пишет:

Можете в таком случае подсказать как через QueryPerformanceCounter реализовать альтернативу sleep

Он не может. По всей вероятности, как я упомянул, этот текст сформирован ChatGPT.

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

7

Re: AHK: Не корректная работа sleep

Можно так попробовать:

SetBatchLines, -1
PS := new PreciseSleep
start := A_TickCount
PS.Sleep(1000)
end := A_TickCount - start
PS := ""
MsgBox, % end

class PreciseSleep {
   __New(TimePeriod := 3) {
      this.timePeriod := TimePeriod
      DllCall("Winmm\timeBeginPeriod", "UInt", TimePeriod)
   }
   __Delete() {
      DllCall("Winmm\timeEndPeriod", "UInt", this.timePeriod)
   }
   Sleep(ms) {
      DllCall("Sleep", "UInt", ms)
   }
}

Хотя у меня особой разницы в точности это не даёт.

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

8

Re: AHK: Не корректная работа sleep

teadrinker пишет:

Хотя у меня особой разницы в точности это не даёт.

На самом деле даёт, надо просто правильно замерять:

SetBatchLines, -1
DllCall("QueryPerformanceFrequency", "Int64P", frequency)
PS := new PreciseSleep()

DllCall("QueryPerformanceCounter", "Int64P", start1)
PS.Sleep(100)
DllCall("QueryPerformanceCounter", "Int64P", end1)

DllCall("QueryPerformanceCounter", "Int64P", start2)
PS.Sleep(1200)
DllCall("QueryPerformanceCounter", "Int64P", end2)

PS := ""
MsgBox, % (end1 - start1)/frequency * 1000 . "`n" . (end2 - start2)/frequency * 1000

class PreciseSleep {
   __New(TimePeriod := 3) {
      this.timePeriod := TimePeriod
      DllCall("Winmm\timeBeginPeriod", "UInt", TimePeriod)
   }
   __Delete() {
      DllCall("Winmm\timeEndPeriod", "UInt", this.timePeriod)
   }
   Sleep(ms) {
      DllCall("Sleep", "UInt", ms)
   }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: AHK: Не корректная работа sleep

Получается QueryPerformanceCounter точнее чем A_TickCount.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10

Re: AHK: Не корректная работа sleep

teadrinker
В коде uPeriod = 3, но погрешность на практике 1 мс, что то не работает.

https://learn.microsoft.com/en-us/windo … eginperiod

Установка более высокого разрешения может повысить точность интервалов времени ожидания в функциях ожидания. Однако это также может снизить общую производительность системы, поскольку планировщик потоков чаще переключает задачи.

Если настройка глобальная и не особо полезная, не лучше её сразу отключать?


   Sleep(ms) {
		DllCall("Winmm\timeBeginPeriod", "UInt", 3)
		DllCall("Sleep", "UInt", ms)
		DllCall("Winmm\timeEndPeriod", "UInt", 3) 
   }
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11

Re: AHK: Не корректная работа sleep

serzh82saratov пишет:

погрешность на практике 1 мс, что то не работает.

А почему 1 не может быть?

MsgBox % mod(100, 3)

Ну и некоторая погрешность измерения возможно остаётся.

serzh82saratov пишет:

Если настройка глобальная и не особо полезная, не лучше её сразу отключать?

Так у меня иногда погрешность до 7 вырастает. Кроме того, такой Sleep чаще всего используется в цикле, чтобы получить минимальную, но не нулевую паузу. Если менять эту настройку каждые несколько милисекунд, возможно будет сказываться на производительности, и не сойдёт ли с ума компьютер? Кроме того,

Starting with Windows 10, version 2004, this function no longer affects global timer resolution.

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

12 (изменено: serzh82saratov, 2023-03-12 16:52:38)

Re: AHK: Не корректная работа sleep

teadrinker пишет:

MsgBox % mod(100, 3)

Убедил, просто у меня больше 1го не было.

teadrinker пишет:

Starting with Windows 10, version 2004, this function no longer affects global timer resolution.

То есть это настройка для текущего процесса? timeEndPeriod становится не нужен в контексте постоянной необходимости DllCall("Sleep", "UInt", ms)?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13

Re: AHK: Не корректная работа sleep

Почему не нужен, то, что ты процитировал выше, тоже верно, нагрузка на систему увеличивается.

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

14

Re: AHK: Не корректная работа sleep

teadrinker пишет:

Почему не нужен

А зачем нужен?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

15

Re: AHK: Не корректная работа sleep

Чтобы снизить нагрузку на систему же.

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

16

Re: AHK: Не корректная работа sleep

Со стороны одного процесса?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17

Re: AHK: Не корректная работа sleep

А что тебя удивляет? Нагрузка не всегда исчерпывается отображаемым в Диспетчере задач процентом.

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

18

Re: AHK: Не корректная работа sleep

Ничего не удивляет, я спросил, ты говоришь про нагрузку со стороны одного процесса?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

19

Re: AHK: Не корректная работа sleep

Точнее будет сказать, что нагрузка возникает из-за применения этой фичи.

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