1 (изменено: Karagiozis, 2018-10-27 23:42:18)

Тема: AHK: перестает работать таймер

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

Мне нужен Loop, который вызывает функции по очереди по кругу и нужен таймер который следил бы если что то происходит не так, то он вызывает функцию vernylsya()  и начинает все сначало.
Для эмуляции что что-то не так надо нажать F2. После нажатия функция vernylsya() срабатывает, код переходит делать все с начало, но следящий таймер уже не работает.

#Persistent

SetTimer, stuck, 200

Goto, start

return

;эмулируем ситуацию 
F2::
stuck := 1
return

start:
	Loop
	{
		take()
		sleep 500
		otnes()
		sleep 500
		vernylsya()
		sleep 500
	}
return

stuck:
ToolTip, %A_TickCount% ,100,150, 2
if (stuck == 1)
{
	ToolTip, Что-то пошло не так: %A_TickCount% ,100,150, 2
	vernylsya()
	stuck := 0
	Goto, start
}
return

take()
{
	ToolTip, Взял,100,100, 1
}

otnes()
{
	ToolTip, отнес делаль,100,100, 1
}

vernylsya()
{
	ToolTip, вернулся обратно,100,100, 1
}

Даже если засунуть таймер в Loop то все равно таймер не возобновляет работу

#Persistent

SetTimer, stuck, 200

Goto, start

return

;эмулируем ситуацию 
F2::
stuck := 1
return

start:
	Loop
	{
		SetTimer, stuck, 200
		take()
		sleep 500
		otnes()
		sleep 500
		vernylsya()
		sleep 500
	}
return

stuck:
ToolTip, %A_TickCount% ,100,150, 2
if (stuck == 1)
{
	ToolTip, Что-то пошло не так: %A_TickCount% ,100,150, 2
	vernylsya()
	stuck := 0
	Goto, start
}
return

take()
{
	ToolTip, Взял,100,100, 1
}

otnes()
{
	ToolTip, отнес делаль,100,100, 1
}

vernylsya()
{
	ToolTip, вернулся обратно,100,100, 1
}

2

Re: AHK: перестает работать таймер

#Persistent

SetTimer, stuck, 200

Goto, start

return

;эмулируем ситуацию 
F2::
stuck := 1
return

start:
	Loop
	{
		take()
		sleep 500
		otnes()
		sleep 500
		vernylsya()
		sleep 500
	}
return

stuck:
ToolTip, %A_TickCount% ,100,150, 2
if (stuck == 1)
{
	ToolTip, Что-то пошло не так: %A_TickCount% ,100,150, 2
	vernylsya()
	stuck := 0
}
return

take()
{
	ToolTip, Взял,100,100, 1
}

otnes()
{
	ToolTip, отнес делаль,100,100, 1
}

vernylsya()
{
	ToolTip, вернулся обратно,100,100, 1
}

3

Re: AHK: перестает работать таймер

MandarinKa02, это не выход.
Karagiozis, следующий таймер не работает потому что не завершается метка предыдущего. Goto переводит в бесконечный цикл и Return не достигается.
То что вы хотите реализовать красиво в одном процессе не выйдет потому что язык однопоточный.
Можете попробовать перед Goto отключить таймер и установить заново, однако каждое срабатывание будет увеличивать стек вызовов, что ограничавает их кол-во.
Вообще старайтесь не пользовать GoTo. И кстати, зачем транслит? Пишите вернулся().

4

Re: AHK: перестает работать таймер

Спасибо за объяснения.