1 (изменено: elektrovenik, 2013-02-05 23:37:17)

Тема: AHK: Проблемы с циклами

И так имеется макрос, нажатие клавиши N - вызывает отправку нажатий еще нескольких клавиш. Один из наболее важных моментов - желательно максимально быстрое исполнение макроса. Выполняется макрос в онлайн-приложении, пинговал сервер несколько раз, в разное время суток, в течении 2х-3х часов - пинг стабильный, 6мс. Но тем не менее регулярно случаются "непрожатия" тех или иных клавиш, причем что удивительно, может выпасть как клавиша из середины скрипта, т.е последующие за ней все же нажмутся, так и последняя, что наиболее логично.
Хотелось бы как то решить проблему, читал что операцию GetKeyState в цикле, лучше заменять на KeyWait, но реализовать не смог. Вообщем хочется найти и решить проблему.


$vkC0::Suspend

$vk57::
Loop 1
{
if not GetKeyState("vk57", "P")
break
Send {vk41}
sleep 50
Send {vk44}
sleep 50
Send {vk57}
}

$vk51::
Loop 1
{
if not GetKeyState("vk51", "P")
break
Send {vk51}
sleep 50
Send {vk59}
sleep 50
Send {vk55}
}

$vk41::
Loop 1
{
if not GetKeyState("vk41", "P")
break
Send {vk41}
sleep 50
Send {vk59}
sleep 50
Send {vk55}
}

$vk44::
Loop 1
{
if not GetKeyState("vk44", "P")
break
Send {vk44}
sleep 50
Send {vk48}
sleep 50
Send {vk4A}
sleep 50
Send {vk4B}
}

2

Re: AHK: Проблемы с циклами

elektrovenik, ознакомься с этой темой, отредактируй заголовок.

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

3 (изменено: creature.ws, 2013-02-06 07:42:40)

Re: AHK: Проблемы с циклами

Цикл, подразумевающий выполнение тела цикла один раз, не имеет смысла.
break в теле цикла, выполняющегося однократно, не имеет смысла.

Но тем не менее регулярно случаются "непрожатия" тех или иных клавиш

Прочитайте в справке про SetKeyDelay, попробуйте увеличить паузы между «нажатием и отпусканием» клавиши c помощью этой команды.
Ознакомьтесь с «часто задаваемыми вопросами» FAQ

4

Re: AHK: Проблемы с циклами

Вот так попробуйте:


SetKeyDelay,, 50

В начало скрипта эту команду поставьте.

5 (изменено: creature.ws, 2013-02-06 08:04:12)

Re: AHK: Проблемы с циклами

Или SetKeyDelay, 50, 50
Тогда Sleep 50 между вызовами Send будут не нужны.

Send {vk41}{vk44}{vk57}

6 (изменено: elektrovenik, 2013-02-07 02:30:16)

Re: AHK: Проблемы с циклами

Спасибо за отзывы и помощь. Вопрос к разработчикам - почему у вас большинство скриптов, представляющих собой макрос, пишутся в линейной форме? Такова правильная грамотность скрипта? Я находил готовые макросы для своей программы, только в виде столбцов.
Хотя в такой форме все выглядит весьма приятно.

SetKeyDelay,, 50

$vkC0::Suspend

$vk57::
Send,{vk41}{vk44}{vk57}
return

$vk51::
Send,{vk51}{vk59}{vk55}
return

$vk41::
Send,{vk41}{vk59}{vk55}
return

$vk44::
Send {vk44}{vk48}{vk4A}{vk4B}
return

7 (изменено: creature.ws, 2013-02-07 02:22:00)

Re: AHK: Проблемы с циклами

писать макросы в форме столбика.

И в начале каждой строки копировать-вставлять команду Send

Такова правильная грамотность скрипта?

Так — количество ненужных действий уменьшается.

Можно ли верхний пример "столбца" преобразовать в линейный?

Верхний пример содержит команду KeyWait, большинство команд в Autohokey «в одну строку» не могут быть записаны.

$vk57::
Loop 1
{
if not GetKeyState("vk57", "P")

Сразу же после нажатия клавиши vk57 вы проверяете её состояние, вы считаете, что можете удерживать нажатую клавишу менее доли миллисекунды?

8

Re: AHK: Проблемы с циклами

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

Send,{vk51}sleep n{vk59}sleep n1{vk55}

?

9 (изменено: creature.ws, 2013-02-07 02:37:17)

Re: AHK: Проблемы с циклами

Запись последовательности нажатий клавиш в одну строку не самоцель. Если между нажатиями необходимо задать различные периоды ожидания (для чего команда SetKeyDelay не предназначена) то уместным  будет использование Sleep число и разбиение строки.

10

Re: AHK: Проблемы с циклами

Понял, спасибо за консультацию. Очень жалею что ранее( посещаю Ваш форум уже давно) не обращался к Вам за помощью.