1 (изменено: ypppu, 2016-04-05 14:34:07)

Тема: AHK: Как правильно прервать циклы?

При попытке прервать цикл - пишет ошибку... Как исправить?

SendKey(Key, Pause)
{
	WinGet, active_id, ID, A
	if (true){
		Send, % key
		Sleep Pause
	}else{
		Break Mirage4; Первая ошибка
	}
}
~*CapsLock::

if (GetKeyState("CapsLock", "T")){
	SetTimer, Mirage4, -1
}else{
	Break Mirage4; Вторая ошибка
}

Mirage4:
loop {
	SendKey("{vk53sc01F down}",625)
	SendKey("{vk53sc01F up}",625)
	SendKey("{vk57sc011 down}",625)
	SendKey("{vk57sc011 up}",625)
	SendKey("{vk34sc005 2}",2500)
	SendKey("{vk34sc005}",625)
}
Exit
return

2

Re: AHK: Как правильно прервать циклы?

Цикл правильно прерывать командой Break. Рекомендую заодно почитать про команду Continue.

3 (изменено: Morty Mels, 2016-04-05 11:26:42)

Re: AHK: Как правильно прервать циклы?

ypppu пишет:

Цикл правильно прерывать командой Break. Рекомендую заодно почитать про команду Continue.

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

SendKey(Key, Pause)
{
	WinGet, active_id, ID, A
	if (true){
		Send, % key
		Sleep Pause
	}else{
		Break Mirage4; Первая ошибка<<<-------------------ТУТ!!!
	}
}
~*CapsLock::

if (GetKeyState("CapsLock", "T")){
	SetTimer, Mirage4, -1
}else{
	Break Mirage4; Вторая ошибка <<<-------------------ТУТ!!!
}

Mirage4:
loop {
	SendKey("{vk53sc01F down}",625)
	SendKey("{vk53sc01F up}",625)
	SendKey("{vk57sc011 down}",625)
	SendKey("{vk57sc011 up}",625)
	SendKey("{vk34sc005 2}",2500)
	SendKey("{vk34sc005}",625)
}
Exit
return

P.S. Покапал в сторону SetTimer и немного переписал скрипт. Сделал его более стабильным и хотя бы немного работающим, но проблемы все равно  остались. http://forum.script-coding.com/viewtopi … 90#p102290

4

Re: AHK: Как правильно прервать циклы?

В описании написано:

AutoHotkey Help пишет:

Valid inside any kind of loop.

Команда должна быть помещена внутрь цикла.

5

Re: AHK: Как правильно прервать циклы?

ypppu Применяется она в цикле, но поместить ее внутрь цикла я не могу.

6

Re: AHK: Как правильно прервать циклы?

SendKey(Key, Pause)
{
	WinGet, active_id, ID, A
	if (true){
		Send, % key
		Sleep Pause
	}else{
		Off := "1"
	}
}
~*CapsLock::
if (GetKeyState("CapsLock", "T")){
	SetTimer, Mirage4, -1
}else{
	Off := "1"
}

Mirage4:
loop {
If Off = 1
Break
	SendKey("{vk53sc01F down}",625)
	SendKey("{vk53sc01F up}",625)
	SendKey("{vk57sc011 down}",625)
	SendKey("{vk57sc011 up}",625)
	SendKey("{vk34sc005 2}",2500)
	SendKey("{vk34sc005}",625)
}
Off := ""
return

7

Re: AHK: Как правильно прервать циклы?

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

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

8 (изменено: KusochekDobra, 2016-04-23 15:42:01)

Re: AHK: Как правильно прервать циклы?


#z::
new_i := 0
While (new_i = 0)
	{
	Random, rand, 1830000, 1850000
	; некоторый код
	sleep rand
	}
return

#x::
new_i := 1
; некоторый код
return

Здесь Win+X призван останавливать работу цикла в теле Win+Z, что в принципе и происходит, но Win+Z после этого не реагирует. Подозреваю, что он "Sleep" rand миллисекунд. В этом случае было бы выгоднее поместить этот цикл в другой бесконечный цикл, в котором запоминается время входа в последний, где его условием будет истечение промежутка времени полученного в rand, который так-же можно прервать, присвоив по Win+X значение удовлетворяющее условию, а его содержимое вынести в первый бесконечный цикл, сделав последний лишь ожидающим нужный интервал, или сигнал.


#z::
var_1 = 0
while (var_1 = 0)
	{
	; некоторый код
	timer_1 := ; получить время работы операционной системы с момента последнего запуска в миллисекундах
	Random, rand, 1830000, 1850000
	var_2 = 0
	timer_2 = timer_1 + %rand%
	while (timer_1 < timer_2 )
		{
		sleep 50
		}
	}
return

#x::
timer_1 := timer_2
; некоторый код
return

Подскажите пожалуйста, где можно почитать по русски про таймеры?

9 (изменено: serzh82saratov, 2016-04-23 16:02:16)

Re: AHK: Как правильно прервать циклы?

#z::
	new_i := 0
	
	Label:
	If (new_i = 0)
	{
		Random, rand, 1830000, 1850000
		ToolTip % A_TickCount
		SetTimer, Label, -%rand%
	}
	Return

#x::
	new_i := 1
	SetTimer, Label, Off
	; некоторый код
	Return

Подскажите пожалуйста, где можно почитать по русски про таймеры?

А на этом ресурсе чем не подошло?
Сначала тут, потом про что за минус перед Period, читаем во встроенной справке, с переводчиком всё довольно понятно.

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

10

Re: AHK: Как правильно прервать циклы?

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