1 (изменено: Gabe_#33, 2014-03-14 04:34:35)

Тема: AHK: Альтернатива команды "sleep".

Доброго времени суток ребятки.
Помогите пожалуйста.
В общем,нужно сделать строго ровно 300 кликов мышкой за 30 секунд.
Чего то никак не получается...

SetMouseDelay , -1

Lbutton::
While GetKeyState("Lbutton", "P")   
{
Click down
Sleep 52
Click up
Sleep 52
}
Return

Постоянно выдаёт по разному...плюс,минус 1-3 клика. А нужно точно,точно 300.

2

Re: AHK: Альтернатива команды "sleep".

Lbutton::
loop, 300 
{
Click down
Sleep 49
Click up
Sleep 49
}
Return

3

Re: AHK: Альтернатива команды "sleep".

Программа в которой замеряю клики,за два теста выдала одно и то же...299 Кликов и 2 секунды времени пустого простоя мышки. Нужно лучше.

4

Re: AHK: Альтернатива команды "sleep".

Попробуйте кол.во кликов замерить используя другие методы посыла, например sendinput и.т.п.
По поводу трёх секунд, смогу написать позже. Но можете сами, надо просто делать паузы равные оставшемуся времени делённому на оставшееся кол.во кликов.

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

5

Re: AHK: Альтернатива команды "sleep".

serzh82saratov пишет:

По поводу трёх секунд, смогу написать позже.

"Трёхсот" секунд. Как сможете,помогите,очень надо.

6

Re: AHK: Альтернатива команды "sleep".

Gabe_#33 пишет:

Программа в которой замеряю клики,за два теста выдала одно и то же...299 Кликов и 2 секунды времени пустого простоя мышки. Нужно лучше.

  Оттачивать предлагаю самому.

7

Re: AHK: Альтернатива команды "sleep".

Не пойму, в топике надо 30 сек, или теперь уже надо 300…
Пк нет, проверьте такой код для 30 сек.


Lbutton::
start := A_tickcount
loop 300
{
Sendinput {lbutton}
Sleep % (30000-(a_tickcount-start))//(300-a_index)
}
Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8 (изменено: Gabe_#33, 2014-03-13 23:04:24)

Re: AHK: Альтернатива команды "sleep".

Извиняю,видать не правильно сформулировал вопрос.
Нужно именно по удержанию Лмышки,набрать такое количество кликов,что бы в минуту вышло ровно 600 или за 30 секунд вышло ровно 300.
(Как на машине,нажал педаль газа и она разогналась до трёхсот км\ч ,отпустил педаль,и скорост падает...)

Foma пишет:

Оттачивать предлагаю самому.

До оттачивался, даже грамотно вопрос поставить не могу=)не спал кучу времени с этим...
Пробовал разные значения команды "sleep", пробовал разные команды посыла клика...Не получается добиться нужного,точного результата.

Сегодня под утро,вроде докопался до сути проблемы...Для того что бы сделать 600 кликов в минуту,нужно делать ровно 10 кликов в секунду,соответственно 1 клик ровно в 100 миллисекунд,по моему. Вот только команда "sleep" не даёт это сделать,в связи с своим принципом работы (sleep 10 = 15.6мл\с). Я замерял время выполнения области с кликами

{
Click down
Sleep 52
Click up
Sleep 52
}

Так вот выполняется она то за 94 то за 109 мл\с.,то есть каждый клик с разной скоростью...то за 94 то за 109 и так далее.

В справке про "sleep" нашёл интересную штуку.Вот только так и не понял как ей пользоваться,как бы не кавырял....
В общем нужна какая то альтернатива задержек времени,альтернатива команде - "sleep".

+ Теоретически

Если бы sleep работал бы в миллисекундах, достаточно было бы сделать

{
Click down
Sleep 50    ;Ровно 50 мл\с
Click up
Sleep 50    ;Ровно 50 мл\с
}

В итоге весь отрезок кода выполняется ровно за 100мл\с , чего и пытаюсь добиться , ну если конечно остальные команды тоже не занимают какое то время на исполнение.

9

Re: AHK: Альтернатива команды "sleep".

Если код из 7 поста в ходе тестов работает как надо, то переделайте его под свои нужды.

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

10

Re: AHK: Альтернатива команды "sleep".

serzh82saratov пишет:

Если код из 7 поста в ходе тестов работает как надо, то переделайте его под свои нужды.

Работает,но к сожалению не так как требуется...В любом случае спасибо за труд.

11

Re: AHK: Альтернатива команды "sleep".

Gabe_#33 пишет:

... к сожалению не так как требуется.

Как вы расчитываете получить помощь на форуме, если не уточняете результаты своих тестов?

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

12

Re: AHK: Альтернатива команды "sleep".

Может по такому типу?

#Persistent

SetTimer, Sub, 50
Return


Sub:
If GetKeyState("Lbutton", "P")   
    {
    If counter
        {
        Click down
        counter:=
        }
    Else
        {
        Click up
        counter++
        }
    }
Return

13

Re: AHK: Альтернатива команды "sleep".

serzh82saratov пишет:

Как вы расчитываете получить помощь на форуме, если не уточняете результаты своих тестов?

Извиняюсь,просто прочитал одну статью и уже отчаялся...
Да и

Lbutton::
start := A_tickcount
loop 300
{
Sendinput {lbutton}
Sleep % (30000-(a_tickcount-start))//(300-a_index)
}
Return

Три теста.
1: - 299 кл за 30 сек
2: - 299 кл за 30 сек
3: - 299 кл за 30 сек
Нужно не loop ,а что бы 600кл\мин были стабильны,по удержанию клавиши.

многобанофф пишет:

Может по такому типу?

почему то не работает в программе для тестов,а на раб. столе ведёт себя странно...

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 = 50
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

Этот код по идее должен хоть чем то помочь,но как не пробовал с ним работать,ничего лучше обычного слип не выходит.
И TimePeriod = 3 работает вообще никак...хоть 1000 хоть ноль сюда поставить,никакой разницы абсолютно...

14 (изменено: serzh82saratov, 2014-03-15 09:58:42)

Re: AHK: Альтернатива команды "sleep".

Три теста.
1: - 299 кл за 30 сек
2: - 299 кл за 30 сек
3: - 299 кл за 30 сек

Есть подозрение что не проходит первый клик, попробуйте поставить слип перед кликом.
Главное сделано, точное кол.во кликов, за точный период.
Переделайте под 600 кликов, вставьте условие для выхода если кнопка отпущена, и повтора цикла если клики закончились.
Далее присмотритесь к settimer для упрощения кода, используя в нём задержки зависимые уже от пройденного времени, и уже сделанных кликов, либо попробовать переменную A_Msec.

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

15

Re: AHK: Альтернатива команды "sleep".

Вот пример кода. По условиям задачи щелчок ЛКМ должен производиться каждые 100 мс.  Однако, в строке SetTimer, MyLabel, 94 последний параметр я задал 94 мс (остальные 6 мс мой компьютер где-то "проглатывает") . Попробуйте подобрать от 90 до 99.

Process, Priority, , Realtime
SetBatchLines, -1

SetTimer, MyLabel, 94
SetTimer, MyLabel, OFF
Return

~Lbutton::
N :=
t1 := A_tickcount
SetTimer, MyLabel, ON
Return

~Lbutton Up::
SetTimer, MyLabel, OFF
t2 := A_tickcount
ToolTip, % N . " щелчков за " t2 - t1 . " мсек `r`n" . 60*N/((t2 - t1)/1000) . " щелчков за минуту"
Return

MyLabel:
Click
N ++
Return

16

Re: AHK: Альтернатива команды "sleep".

Серж, штука с индивидуальным подбором времени между кликами,к сожалению не подходит. Хотя набрать нужное колличество кликов за определённый отрезок времени оно может. Но всё же нужна стабильность между кликами.
Может,можно как то добиться меньшей погрешности команды "sleep"?
А то "sleep 50",замеры показывают 46-47 мл.сек, "sleep 52" и вовсе то 47 то 62...

L::
While GetKeyState("L", "P")   
  {
   NV := A_TickCount
click down
sleep 52
click up
sleep 52
   ToolTip % (A_TickCount-NV)  ; Показывает стабильные колебания (то 94 то 109)
  }
Return

Работает более менее стабильно и клики проходят относительно ровно. Но неужели нельзя лучше?

З.Ы

   NV := A_TickCount
click down
sleep 54
click up
sleep 37
   ToolTip % (A_TickCount-NV)  ; Показывает тот же результат,а цифры меньше...
ypppu пишет:

Вот пример кода. По условиям задачи щелчок ЛКМ должен производиться каждые 100 мс.

MyLabel, 94 получается 303,301,302 за 30 сек.
MyLabel, 95 получается 280...

Блин вот печаль вообще...=(
А A_Msec работает по тому же принципу как и A_tickcount?

17

Re: AHK: Альтернатива команды "sleep".

А как Вы удерживали кнопку ровно 30,00 сек?

18

Re: AHK: Альтернатива команды "sleep".

Gabe_#33 пишет:

Но всё же нужна стабильность между кликами.

Так и не могу до конца понять задачу. До какой степени стабильность устроит? Только идеально по 100 мс?
А то первым делом приходит мысль взять любой из наиболее стабильных вариантов и добавить промежуточные проверки. К примеру, каждую секунду проверять - не сделано ли лишних кликов или наоборот нет ли недостающих, а соответственно в следующую секунду принудительно убирать/добавлять клик. При таком подходе теоретически можно достичь стабильности по количеству на некие промежутки времени - это подходит?

19 (изменено: serzh82saratov, 2014-03-15 15:48:27)

Re: AHK: Альтернатива команды "sleep".

Серж, штука с индивидуальным подбором времени между кликами,к сожалению не подходит.

Так я и не предлагаю, если речь про то чтобы как в топике подобрать волшебное значение. Если вы про мой вариант, то почему не подходит?
Вы внимательно почитайте про слип и таймер. Нет никаких гарантий точных интервалов выполнения, и судя по описанию причин, этого не сможет гарантировать и "нечто другое". Потому предложено проверять реальное время выполнения после каждого действия, чтобы нужное кол.во действий было выполнено именно за определённое время.

Попробуйте так протестировать;


SetBatchLines -1
ListLines Off
#NoEnv

Lbutton::
start := A_tickcount
loop 600
{
Sleep % (60000-(a_tickcount-start))//(601-a_index)
Sendinput {lbutton}
}

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

20

Re: AHK: Альтернатива команды "sleep".

ypppu пишет:

А как Вы удерживали кнопку ровно 30,00 сек?


В ВК есть приложение ,там даётся ровно 30 сек,сколько накликаешь...
Ещё непосредственно на компе есть прога,а так же есть батлфилд,в котором можно прослушать с какой частотой кликается мышь.
Кстати,вот! В идеале вот в идеале,хотел добиться так что бы - "Берёшь автомат в любой игрушке...нажимаешь мышь и выпускается вся обойма. Не захлёбывается и с размеренными паузами. И при этом очень быстро."

+ off

Блин даже не думал что всё настолько сложно и что так затянется писанина на форуме,обычно здесь только читаю=). В любом случае,спасибо всем за помошь и работу=)

21

Re: AHK: Альтернатива команды "sleep".

Так это... Зачем для какой-то хрени такая космическая точность?

22

Re: AHK: Альтернатива команды "sleep".

Ну, с академической точки зрения, довольно занимательный вопрос.

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

23

Re: AHK: Альтернатива команды "sleep".

Gabe_#33 пишет:

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

  Мне кажется, что такая примочка может сильно изменить скорость кликов.

24

Re: AHK: Альтернатива команды "sleep".

Мда, квантование по 15,6 мс видимо не оставляет другого выбора, кроме как занять некоторое время чем-то не основанным на этом квантовании.
Я бы попробовал так.

Lbutton::
Click
While GetKeyState("Lbutton", "P")
    {
    Sleep, 94
    Loop, 7700  ;на моем ноутбуке за те самые 15,6 мс происходит почти 20000 итераций, соответственно 
                         ;7700 примерно пропорционально недостающим 6 мс
        {
        FutileCounter++
        }
    Click
    }
Return

К сожалению, проверить не имею возможности - искать внешний счетчик кликов лень, а любой внутренний, как я понимаю, связан тем же квантованием по 15,6.

25

Re: AHK: Альтернатива команды "sleep".

Sleep, 94
    Loop, 7700  ;на моем ноутбуке те самые 15,6 мс происходит почти 20000 итераций, соответственно за
                         ;7700 примерно пропорционально недостающим 6 мс


Да на каждой машине своё будет.
Даже если представить, что можно кликать каждые 100 мсек, то малейшая "подгрузка" проца, и в установленное время уже никак не уложится.
И откуда вы взяли 15,6мсек.
И зачем Sleep, 94, если в справке указано округление до10мсек.

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

26

Re: AHK: Альтернатива команды "sleep".

serzh82saratov пишет:

Да на каждой машине своё будет.

Разумеется. Уж не потому ли в примечании упоминается именно мой ноутбук?

serzh82saratov пишет:

Даже если представить, что можно кликать каждые 100 мсек, то малейшая "подгрузка" проца, и в установленное время уже никак не уложится.

Хоть что-то. Есть место для экспериментов. Все-таки 6 мс - не так много.

serzh82saratov пишет:

И откуда вы взяли 15,6мсек.
И зачем Sleep, 94, если в справке указано округление до10мсек.

Это Вы перевод видно читали. А в англоязычной указаны и 10 и 15,6 как типичные величины, до кратности которым округляются значения квантов времени. Несколько нехитрых экспериментов позволили мне убедиться, что мой удел - именно 15,6. Несколько нехитрых умозаключений позволили прийти к выводу, что это удел большинства, если не всех, отписавшихся в теме.
Попросту говоря, при кратности квантования 10 мс как раз периоды в 100 мс задавались бы беспроблемно, а на самом деле получается или 93/94 или 109/110. Попробуйте, может Вы счастливчик с квантованием-10?

Process, Priority, , Realtime
SetBatchLines, -1

~Lbutton::
GoSub, Sub
Return

Sub:
If GetKeyState("Lbutton", "P")
    {
    ToolTip, % A_tickcount - TimeOfClick
    TimeOfClick := A_tickcount
    SetTimer, Sub, -100
    }
Return

27 (изменено: serzh82saratov, 2014-03-16 01:45:21)

Re: AHK: Альтернатива команды "sleep".

Так не выйдет, таймер надо сразу назначить без минуса, иначе не учитывается время выполнения команд и проверки условий в цикле.
И 6мс это много, умножьте их на 600 например как в задаче, и получаем ещё 3,6 сек в гору к каждой минуте, а это уже много.

И опять же, что по счёт непредвиденной нагрузки на проц? Это никак не учтено...

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

28

Re: AHK: Альтернатива команды "sleep".

Почему вы так упорно не хотите попробовать воспользоваться функциями?

DllCall("Winmm\timeBeginPeriod", uint, ***)
DllCall("Winmm\timeEndPeriod", UInt, ***)

По мне,в справке,явно написано...,конкретно моей ситуации оно поможет.
Вот только у меня проблема заключается в том что функция эта,как будто не работает... Разницы не заметно совсем...Да и возвращает она - "0" а мне кажется это показывает на то что сработала она,далеко не норм.

29

Re: AHK: Альтернатива команды "sleep".

А где ссылки на эту статью?

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

30

Re: AHK: Альтернатива команды "sleep".

serzh82saratov пишет:

Так не выйдет, таймер надо сразу назначить без минуса, иначе не учитывается время выполнения команд и проверки условий в цикле.
И 6мс это много, умножьте их на 600 например как в задаче, и получаем ещё 3,6 сек в гору к каждой минуте, а это уже много.

И опять же, что по счёт непредвиденной нагрузки на проц? Это никак не учтено...

Вы, как обычно, отвлекаетесь на частности. Единый таймер дает те же результаты, так что доверьтесь этому и познайте уже свою кратность.

31

Re: AHK: Альтернатива команды "sleep".

Gabe_#33 пишет:

Почему вы так упорно не хотите попробовать воспользоваться функциями?

DllCall("Winmm\timeBeginPeriod", uint, ***)
DllCall("Winmm\timeEndPeriod", UInt, ***)

По мне,в справке,явно написано...,конкретно моей ситуации оно поможет.
Вот только у меня проблема заключается в том что функция эта,как будто не работает... Разницы не заметно совсем...Да и возвращает она - "0" а мне кажется это показывает на то что сработала она,далеко не норм.

А может таки пренебречь одним квантом? Тогда можно просто чередовать периоды 94 и 109 мс. Или только смерть разлучит нас со 100 мс?

32

Re: AHK: Альтернатива команды "sleep".

Слишком много букаff.
И что есть "единый таймер"?

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

33

Re: AHK: Альтернатива команды "sleep".

serzh82saratov пишет:

Слишком много букаff.
И что есть "единый таймер"?

По Вашей терминологии это тот, который сразу и без минуса. Так что букафф у меня-то и меньше.

34

Re: AHK: Альтернатива команды "sleep".

Единый таймер дает те же результаты

А Вы каким кодом получили эти самые результаты?

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

35

Re: AHK: Альтернатива команды "sleep".

А чем мой вариант не устраивает? Как при бездействии, так и при 100% загрузке  процессора один-в-один укладывается.

36

Re: AHK: Альтернатива команды "sleep".

Я так понял что результаты тестов, не устроили.

MyLabel, 94 получается 303,301,302 за 30 сек.
MyLabel, 95 получается 280...

----

Три теста.
1: - 299 кл за 30 сек
2: - 299 кл за 30 сек
3: - 299 кл за 30 сек

Вот почему это, не устраивает ТС  переделать под желаемое кол.во кликов, выход при отпускании кнопки или повтор цикла (который вроде как у него показывает стабильные результаты) если кнопка не отпущена, мне не ясно.

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

37

Re: AHK: Альтернатива команды "sleep".

Gabe_#33 пишет:

Почему вы так упорно не хотите попробовать воспользоваться функциями?

DllCall("Winmm\timeBeginPeriod", uint, ***)
DllCall("Winmm\timeEndPeriod", UInt, ***)

...

Это нетрудно, только интервалы времени по разному считаются почему-то. Подгони сам задержку при помощи SleepDuration.

SetBatchLines -1
SleepDuration := 50, TimePeriod := 3
Return

~LButton::
Count := 0, start := A_tickcount
DllCall("Winmm\timeBeginPeriod", uint, TimePeriod)
DllCall("QueryPerformanceCounter", "Int64*", StartTime)
   While GetKeyState("LButton", "P") {
      DllCall("Sleep", UInt, SleepDuration)
      Count++
      Click
}
DllCall("QueryPerformanceCounter", "Int64*", EndTime)
DllCall("Winmm\timeEndPeriod", UInt, TimePeriod)
end := A_tickcount
MsgBox % "Ratio(Query) = " . Count * 1000000 / (EndTime  - StartTime)
       . "`nRatio(TickCount) = " . Count * 1000 / (end  - start)
       . "`nTime = "  (end - start) / 1000 . "`nCount = " Count
Return

38

Re: AHK: Альтернатива команды "sleep".

serzh82saratov пишет:

Я так понял что результаты тестов, не устроили.

По-моему, у ТС методы контроля какие-то левые. Я же специально в скрипт встроил Tooltip, который отчитывается: сколько миллисекунд прошло, сколько сделано щелчков. И всё это отталкивается не от какой-то абстрактной точки отсчёта, а от часов компьютера.

39 (изменено: serzh82saratov, 2014-03-16 12:26:43)

Re: AHK: Альтернатива команды "sleep".

Про время Вы хорошо напомнили http://forum.script-coding.com/viewtopi … 988#p74988. Но даже на ежесекундных подобранных значениях, вы очень скоро увидите расхождения. Простейший тест:


settimer, proc, 90
return

proc:
tooltip, % a_msec
return

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

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

40

Re: AHK: Альтернатива команды "sleep".

ypppu пишет:

А чем мой вариант не устраивает? Как при бездействии, так и при 100% загрузке  процессора один-в-один укладывается.

В Вашем варианте 1 клик происходит каждые 94 мс, то есть с 17-го клика пойдет накапливаемое расхождение с требуемым количеством.
А 94 - не потому, что Ваш компьютер "съедает" 6 мс, а потому что 94 это близко к значению, кратному 15,6 мс. Именно квантом 15,6, как я понимаю, у всех отписавшихся оперирует система (в справке сказано - зависит от железа и дров). Поэтому задание временных параметров что для Sleep, что для SetTimer в промежутках между значениями, кратными 15,6 мс, по большому счету бессмысленно. 94 - как раз пороговое значение, при 95 фактический период становится близким 109 (при прогоне подряд меняется на единицу - видимо из-за дробной части у кванта). Такое же квантование и для A_tickcount, в чем нетрудно убедиться, замеряя время очень быстро выполняемых операций в цикле.

41

Re: AHK: Альтернатива команды "sleep".

serzh82saratov пишет:

Простейший тест:


settimer, proc, 90
return

proc:
tooltip, % a_msec
return

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

Не понял смысл теста.


многобанофф пишет:

В Вашем варианте 1 клик происходит каждые 94 мс, то есть с 17-го клика пойдет накапливаемое расхождение с требуемым количеством.
А 94 - не потому, что Ваш компьютер "съедает" 6 мс, а потому что 94 это близко к значению, кратному 15,6 мс.

В моём варианте 1 клик происходит каждые 100 мс. Если бы я задал 100, то число кликов начало бы отставать (точная причина мне неизвестна). Но я задал 94, чем компенсировал отставание. Теперь за минуту получается ровно 600 кликов.

42 (изменено: serzh82saratov, 2014-03-16 13:42:35)

Re: AHK: Альтернатива команды "sleep".

Не понял смысл теста.

Если действие выполняется ровно каждые 100мс, то при старте мы увидим ну например 648 и далее должно быть 748, 848 и.т.д. Ок, первую цифру в учёт не берём и наблюдаем за 48. Пускай будет всегда плюс потом минус примерно 10 или даже 20 мс. Но по вашей теории, постоянно должно быть рядом с ~50. А на практике будет только смещение вперёд или назад.
Нельзя подобрать заранее точную задержку (тем более понимая, что в очередь команд (для процессора) процесса даже с высоким приоритетом, может всегда вмешатся система или такой же приоритетный процесс, что неминуемо приводит к увеличению времени исполнения), её нужно постоянно корректировать, и никакой дллкэлл или вычисления квантов тут не помогут, имхо конечно.

Ну и для наглядности теста, конечно нужно увеличить задержку до 300~500 мс.

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

43

Re: AHK: Альтернатива команды "sleep".

Хм, тогда в коде должно быть settimer, proc, 100? В этом случае действительно две последние цифры прыгают, хотя не должны. А вот если задать settimer, proc, 1000, то уже все три цифры не прыгают.

Кстати, в моей подпрограмме таймера просто щелчок ЛКМ и и увеличение переменной N на единицу. Возможно, это гораздо быстрее, чем прорисовать ToolTip.

44 (изменено: serzh82saratov, 2014-03-16 15:08:34)

Re: AHK: Альтернатива команды "sleep".

Кстати, в моей подпрограмме таймера просто щелчок ЛКМ и и увеличение переменной N на единицу. Возможно, это гораздо быстрее, чем прорисовать ToolTip.

Ну так речь идёт про алгоритм выполнения действий через определённый отрезок времени, который не надо под каждый случай и пк подгонять. И если он не в состоянии вовремя отобразить тултип, или как в приведённой теме перерисовать часы (там кстати как раз 1000мс, и очень быстро становится видно что секунды сбиваются), то зачем использовать такой алгоритм, когда есть уже простое решение?

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

45

Re: AHK: Альтернатива команды "sleep".

До сих пор представлял себе, что команда SetTimer связана с часами компьютера.

46

Re: AHK: Альтернатива команды "sleep".

ypppu пишет:

В моём варианте 1 клик происходит каждые 100 мс. Если бы я задал 100, то число кликов начало бы отставать (точная причина мне неизвестна). Но я задал 94, чем компенсировал отставание. Теперь за минуту получается ровно 600 кликов.

Я запускал Ваш скрипт и ни разу не видел 600 в минуту. Может как раз у вас квант 10?
Если не затруднит, запустите у себя в таком виде и напишите, что отображается в тултипе:

Process, Priority, , Realtime
SetBatchLines, -1

SetTimer, MyLabel, 94
SetTimer, MyLabel, OFF
Return

~Lbutton::
N :=
t1 := A_tickcount
SetTimer, MyLabel, ON
Return

~Lbutton Up::
SetTimer, MyLabel, OFF
t2 := A_tickcount
ToolTip, % N . " щелчков за " t2 - t1 . " мсек `r`n" . 60*N/((t2 - t1)/1000) . " щелчков за минуту"
Return

MyLabel:
ToolTip % A_tickcount - t3
t3 := A_tickcount
Click
N ++
Return

У меня чередуются 94 и 109 (все из-за той же дробной части как я понимаю).
Потом попробуйте менять 94 на единицу в меньшую сторону, а затем в большую. В моем случае 93 и ниже до 79 включительно дает чередование 93/94, 95 и выше до 109 включительно дает 109/110. После преодоления этих порогов значение изменяется на 15 и т.д.

47

Re: AHK: Альтернатива команды "sleep".

Вот собственно, чем поделился гугл о таймерах (из наиболее доходчивого для меня лично).
А вот это должно бы ответить каждому на вопрос о частоте системного таймера его ПК, но у меня при запуске окно почему-то быстро исчезает, не разглядеть.

48

Re: AHK: Альтернатива команды "sleep".

Тупо зажал Enter и в мелькании разглядел 15,625.

49

Re: AHK: Альтернатива команды "sleep".

Вот с настройками 94. Конечно, я не робот, передержал кнопку на три десятых секунды.
Да, в кванты я лезть не готов, пока в этом не будет практической пользы.

50

Re: AHK: Альтернатива команды "sleep".

ypppu пишет:

Вот с настройками 94. Конечно, я не робот, передержал кнопку на три десятых секунды.
Да, в кванты я лезть не готов, пока в этом не будет практической пользы.

Действительно дает требуемое количество. Более того, не удалось воспроизвести ситуацию с лишним или недостающим кликом. То есть независимо от общего периода и прочих пришедших на ум условий. Почему у меня раньше были абсолютно другие результаты - ума не дам. Единственная разница - сейчас прописал в скрипт, а тогда нажимал вручную (может тачпад и его дрова?...).
Дальнейшие копания привели вот к чему.

Process, Priority, , Realtime
SetBatchLines, -1

SetTimer, MyLabel, 94
SetTimer, MyLabel, OFF
DllCall("QueryPerformanceFrequency", "Int64*", Frequency)
Return

Lbutton::
N :=
t1 := A_tickcount
DllCall("QueryPerformanceCounter", "Int64*", CounterBefore)
SetTimer, MyLabel, ON
Return

MyLabel:
if (A_tickcount > t1 + (1000 * 60))
    {
    SetTimer, MyLabel, OFF
    ToolTip, % N . " щелчков за " t2 - t1 . " мсек `r`n" . 60*N/((t2 - t1)/1000) 
    . " щелчков за минуту `r`n" . (CounterAfter - CounterBefore)/Frequency . " точное время  `r`n"
    . PeriodMax . " <-------> " . PeriodMin
    Return
    }
;Click
N ++
t2 := A_tickcount
CounterAfterOld := CounterAfter
DllCall("QueryPerformanceCounter", "Int64*", CounterAfter)

Period :=(CounterAfter - CounterAfterOld)/Frequency
PeriodMin := !PeriodMin ? 0.1 : PeriodMin > Period ? Period : PeriodMin
PeriodMax := !PeriodMax ? 0.1 : PeriodMax < Period ? Period : PeriodMax

Return

У меня дает реальную продолжительность периодов в пределах от 85 до 116 мс. Если большие периоды можно объяснить нагрузкой, то откуда меньшие?

51

Re: AHK: Альтернатива команды "sleep".

многобанофф пишет:
+ Дальнейшие копания привели вот к чему.
Process, Priority, , Realtime
SetBatchLines, -1

SetTimer, MyLabel, 94
SetTimer, MyLabel, OFF
DllCall("QueryPerformanceFrequency", "Int64*", Frequency)
Return

Lbutton::
N :=
t1 := A_tickcount
DllCall("QueryPerformanceCounter", "Int64*", CounterBefore)
SetTimer, MyLabel, ON
Return

MyLabel:
if (A_tickcount > t1 + (1000 * 60))
    {
    SetTimer, MyLabel, OFF
    ToolTip, % N . " щелчков за " t2 - t1 . " мсек `r`n" . 60*N/((t2 - t1)/1000) 
    . " щелчков за минуту `r`n" . (CounterAfter - CounterBefore)/Frequency . " точное время  `r`n"
    . PeriodMax . " <-------> " . PeriodMin
    Return
    }
;Click
N ++
t2 := A_tickcount
CounterAfterOld := CounterAfter
DllCall("QueryPerformanceCounter", "Int64*", CounterAfter)

Period :=(CounterAfter - CounterAfterOld)/Frequency
PeriodMin := !PeriodMin ? 0.1 : PeriodMin > Period ? Period : PeriodMin
PeriodMax := !PeriodMax ? 0.1 : PeriodMax < Period ? Period : PeriodMax

Return

Что это,как этим пользоваться? У меня рабоет - никак...

52

Re: AHK: Альтернатива команды "sleep".

Это раскуроченный скрипт из поста #15.
По нажатию левой кнопки мыши он в течение минуты замеряет длительность периодов таймера и после истечения минуты вместе с другой информацией выдает продолжительность максимального и минимального  периода.
Сначала, когда я пробовал этот скрипт ypppu у меня получались разные результаты, не отвечающие условиям. Но на следующий день сколько бы я его не гонял, получалось всегда требуемое количество кликов, причем очень точно.
Это меня заинтересовало в свете предыдущих изысканий и я стал измерять продолжительность периодов срабатывания таймера, поскольку в начальном виде скрипт выводил в конце только количество кликов и общее время.

53 (изменено: skyman, 2014-03-21 05:55:16)

Re: AHK: Альтернатива команды "sleep".

Вместо sleep и таймеров точными счетчиками пользоваться надо, вот тут ровно 30 щелчков за 30 секунд:


Process, Priority, , Realtime
SetBatchLines, -1
keepClicking := 0
DllCall("QueryPerformanceFrequency", "Int64*", freQ)

Return

~Lbutton::
N :=
DllCall("QueryPerformanceCounter", "Int64 *", t1)
keepClicking := 1
gosub MyLabel
Return

~Lbutton Up::
keepClicking := 0
DllCall("QueryPerformanceCounter", "Int64 *", t2)
ToolTip, % N . " щелчков за "  (t2-t1)/freQ*1000 . " мсек `r`n" . 60*N/((t2 - t1)/freQ) . " щелчков за минуту"
Return

MyLabel:
DllCall("QueryPerformanceCounter", "Int64 *", CounterBefore)
Click
N ++
Loop
{
DllCall("QueryPerformanceCounter", "Int64 *", CounterAfter)
if (  (CounterAfter - CounterBefore)/freQ >= 0.1)
break
}
if (keepClicking = 1)
GOSUB MyLabel
Return

54

Re: AHK: Альтернатива команды "sleep".

В том-то и волнующе-приятный цимус, что и без пресловутых "точных счетчиков" скрипт с использованием таймеров дает нужный результат, только с небольшими взаимокомпенсирующимися колебаниями продолжительности промежуточных периодов.
Я слишком далек от всего этого, чтобы быть уверенным, но похоже отсчет периодов SetTimer происходит с использованием именно (если правильно запомнил) аппаратного программируемого таймера, а разница в продолжительности периодов обусловлена квантованием, с которым SetTimer получает от него сведения о прошедшем времени. В хелпе АНК в статье про sleep есть скрипт, предназначенный для задания периодов меньших, чем квантование, как я понимаю, основанный на увеличении частоты аппаратного программируемого таймера или частоты получения системой от него сведений (трудно выражаться, не владея терминами ). Так в примечании сказано, что на SetTimer, в отличие от всех приложений, этот метод влияния не оказывает.
Так что похоже, что для решения рассматриваемой задачи SetTimer вполне достаточно.