comando a cada X tempo dentro de um while loop

Tire suas dúvidas sobre programação em AutoHotkey

Moderator: Gio

Ichig0

comando a cada X tempo dentro de um while loop

03 Oct 2020, 00:57

gostaria de saber se é possível executar um comando a cada 60 segundos durante um while loop

Code: Select all

loop:=true
while loop
{
	Sleep, 2000
	Click Left, 553, 390
	Sleep, 2000
	Send, {5}
	Sleep, 2000
	Click Left, 553, 390
	;EU PODERIA COLOCAR UM "SLEEP, 60000" AQUI MAS ISSO FARIA O LOOP PARAR POR 60 SEGUNDOS E NÃO É O QUE EU QUERO
}

;QUERO QUE O COMANDO ABAIXO SEJA EXECUTADO A CADA 60 SEGUNDOS MAS SEM INTERROMPER O LOOP E SEM COLOCAR UM DELAY DE 60000MS NO MESMO
COMANDO(){
	Send, {esc}
	Sleep, 2000
	Click Left, 553, 390
}
User avatar
Gio
Posts: 1075
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: comando a cada X tempo dentro de um while loop

05 Oct 2020, 09:22

Bom dia Ichog0.

Seja bem-vindo ao fórum da comunidade do AutoHotkey.

Você pode usar um timer para executar a rotina que deseja a cada 60 segundos enquanto o resto do script roda durante a espera. Para isso, use o comando SetTimer. Este comando permite que você indica uma label (rotina) para ser executa a cada x milissegundos. No caso, 60 segundos equivalem a 60000 milissegundos.

Exemplo:

Code: Select all

SetTimer, ROTINA_EXEMPLO, 60000

loop:=true
while loop
{
	Sleep, 2000
	Click Left, 553, 390
	Sleep, 2000
	Send, {5}
	Sleep, 2000
	Click Left, 553, 390
	;EU PODERIA COLOCAR UM "SLEEP, 60000" AQUI MAS ISSO FARIA O LOOP PARAR POR 60 SEGUNDOS E NÃO É O QUE EU QUERO
}
Return


ROTINA_EXEMPLO: ; ESTA ROTINA EXECUTÁRA A CADA 60 SEGUNDOS POR CAUSA DO SETTIMER NO INICIO DO SCRIPT. O LOOP WHILE ACIMA EXECUTARÁ ENQUANTO A ROTINA ESTIVER EM ESPERA.
	Send, {esc}
	Sleep, 2000
	Click Left, 553, 390
Return

Espero ter ajudado, se ainda tiver alguma dúvida sobre isso, basta postar abaixo :thumbup:
Ichig0

Re: comando a cada X tempo dentro de um while loop

12 Oct 2020, 05:07

Funcionou! agora estou utilizando 6 SetTimer em meu script, mas, pelo tempo que coloquei neles, uma hora eles irão ser executados ao mesmo tempo ou durante a execução de outro, isso é possível? Ou um SetTimer termina antes de começar o outro?
User avatar
Gio
Posts: 1075
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: comando a cada X tempo dentro de um while loop

13 Oct 2020, 07:35

Bom dia Ichig0.

No AutoHotkey os threads possuem um comportamento padrão que simula o multithreading. Isso significa que para a maioria dos casos, se um thread novo (como uma rotina chamada por SetTimer) surgir enquanto outro thread estiver em execução, o thread novo suspenderá o thread anterior, executará seus comandos, e depois voltará ao thread antigo na linha em que parou. Este comportamento tem algumas variações (por exemplo, threads novo não podem ser interrompidos por alguns milisegundos) para garantir maior estabilidade dos scripts.

Em qualquer caso, o comportamento é totalmente controlável pelo programador, podendo criar uma hierarquia entre os threads ou até torna algun(s) thread(s) críticos (de modo que eles não possam ser interrompidos até sua finalização).

Exemplo: no script abaixo temos duas rotinas SetTimer. Veja que a primeira executa após 5,5 segundos e a segunda após 6 segundos. Mas se você olhar o código da primeira, verá que devido aos sleeps ela levará 3,5 segundos para ser executada. Isso significa que o timer de 6 segundos da segunda rotina vai disparar quando a primeira rotina ainda estiver em execução.

Se usarmos os comandos Critical nas rotinas, o resultado das duas será: ABCDEFGHIJK, mas se NÃO usarmos critical, teremos algo como AGHIJKBCDEF, pois a segunda rotina interromperá a primeira após o A. Teste o código e veja o que ele escreve em um editor de texto (deixe ele aberto, pois o código já começa 5,5 segundo depois de executado). Depois, remova as linhas Critical e teste novamente. Você verá como o uso do Critical impediu a primeira rotina de ser interrompida pelo disparo do timer da segunda.

Code: Select all

#Persistent

SetTimer, ABC, 5500
SetTimer, GHI, 6000
return

ABC:
Critical
send a
sleep 500
send b
sleep 500
send c
sleep 500
send d
sleep 1000
send e
sleep 1000
send f
Return


GHI:
Critical
send g
sleep 500
send h
sleep 500
send i
sleep 500
send j
sleep 1000
send k
Return

Return to “Ajuda e Suporte Geral”

Who is online

Users browsing this forum: No registered users and 4 guests