Alternativa ao comando Sleep

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

Moderator: Gio

gilberto_san
Posts: 4
Joined: 28 May 2020, 12:28

Alternativa ao comando Sleep

28 May 2020, 12:51

Boa tarde estou trabalhando em um script que ao verificar uma determinada condição executa uma função e em seguida, aguarda alguns segundos para fazer as demais verificações.
Seria algo do tipo

Code: Select all

Loop 
{
	testa_condicao1() ; retorna condicao1  com  0 ou 1 
	if condicao1 = 1
		{
		executa_acao1()
		Sleep, 30000
		}
	testa_condicao2() ; retorna condicao2 com  0 ou 1
	if condicao2 = 1
		{
		executa_acao2()
		Sleep, 15000
		}
 }
No caso mostrado, se a condição 1 receber o valor 1 ele executa a ação e espera 30 segundos para a condição 2 ser verificada.
Existe alguma maneira de após executar ação 1 e já passarmos para o próximo teste (sem esperar os 30s ) e depois de decorridos os 30 segundos fazermos o teste da condição 1 novamente?
Não sei se fui claro mas basicamente gostaria de substituir o sleep por outro comando que não parasse o script por 30 segundos porém fizesse essa contagem de tempo e o executasse novamente após decorrido o tempo.
Se puderem ajudar agradeço demais.
User avatar
Gio
Posts: 1069
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Alternativa ao comando Sleep

28 May 2020, 15:31

Boa tarde Gilberto_san.

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

Use o comando SetTimer para criar e controlar repetições em intervalos de tempo que não paralisem outras rotinas.

Exemplo:

Code: Select all

#Persistent ; Este comando é necessário se o script não tiver uma GUI ou hotkeys, pois do contrário ele terminará assim que estiver idle.
SetTimer, TESTAR_1, 30000
SetTimer, TESTAR_2, 15000
Gosub, TESTAR_1 ; Use Gosub se precisar ir para uma rotina imediatamente. No caso fazemos isso aqui para iniciar o script e já executar a primeira vez a rotina TESTAR_1.
return


TESTAR_1:
	testa_condicao1()
	if condicao1 = 1
	{
		executa_acao1()
	}
Return


TESTAR_2:
	testa_condicao2() ; retorna condicao2 com  0 ou 1
	if condicao2 = 1
	{
		executa_acao2()
	}
Return

:arrow: Você também deve tomar cuidado com as funções executa_acao1() e executa_acao2(), pois elas devem terminar antes do tempo do SetTimer (ou então elas devem desligá-lo no início e ligá-lo no fim). A lógica é simples: uma rotina que demora 45 segundos claramente não pode ser executada a cada 15 segundos, por exemplo. Para desligar um SetTimer a qualquer momento basta indicar a mesma label usar o paramêtro off. Exemplo: SetTimer, TESTAR_1, Off

Espero ter ajudado, se ainda tiver alguma dúvida sobre este tópico, basta postar abaixo :thumbup:
gilberto_san
Posts: 4
Joined: 28 May 2020, 12:28

Re: Alternativa ao comando Sleep

28 May 2020, 15:59

Muito obrigado pela ajuda mas meu problema ainda é um pouco diferente.
Da forma com que vc postou o TESTAR1 e ou TESTAR2 vão ser executados a cada 30 e 15 segundos respectivamente.
O que eu realmente precisava era que, se o TESTAR 1 for executado então ele só será executado(fará um teste) novamente após 30 segundos o mesmo vale para o TESTAR 2.

Basicamente o programa testa 1,testa 2 em um loop ... se a condição de um for ativada ele pode repetir o teste somente apos X_1 segundos.
Caso o teste 2 seja ativado ele poderá ser testado novamente após X_2 segundos.
Entendeu ? Se puder ajudar agradeço demais.

Edit1: no meu script original essa é só uma parte, mas gostaria de ativar essa rotina usando o F4

Code: Select all

F4::
; aqui seto alguns parâmetros que são necessários serem iniciados sempre que apertar F4 
Loop 
{
; aqui vai o loop descrito acima
}
return

F5::Reload
F12::ExitApp
User avatar
Gio
Posts: 1069
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Alternativa ao comando Sleep

28 May 2020, 16:48

Entendi. Neste caso a solução é praticamente a mesma: Use o SetTimer. A única diferença é que você vai ligar ele quando a rotina condicionada terminar e desligar quando ela começar.
Também pode ser o caso de usar uma variável para identificar no loop que a rotina está "em espera".

Exemplo (veja os comentários nas linhas do código):

Code: Select all

#Persistent ; Este comando é necessário se o script não tiver uma GUI ou hotkeys, pois do contrário ele terminará assim que estiver idle.
PAUSA := 0 ; Iniciamos o valor da variável em 0 (para executar a primeira vez assim que a outra condição for satisfeita).

Loop 
{
	testa_condicao1()
	if ((condicao1 = 1) AND (PAUSA = 0)) ; Passamos a ter uma segunda condição para executar a ação: a variável PAUSA tem que estar em 0 (ela já estará em 0 no início do script, então a primeira execução independe dela)
		{
			executa_acao1()
		}
 }


executa_acao1()
{
	Global PAUSA
	Tooltip, Exemplo
	Sleep 2000
	ToolTip, De rotina
	Sleep 2000
	ToolTip, Qualquer
	PAUSA := 1 ; Dentro da rotina colocamos a variável PAUSA em 1. Ao fazer isso, impedimos a rotina de executar novamente.
	SetTimer, DESLIGAR_PAUSA, 30000 ; Mas logo em seguida, ainda nesta rotina, ligamos um Timer de 30 segundos que vai zerar de novo a variável PAUSA.
}
Return


DESLIGAR_PAUSA:
PAUSA := 0 ; Aqui zeramos de novo a variável PAUSA.
SetTimer, DESLIGAR_PAUSA, Off ; e depois desligamos o Timer de 30 segundos.
Return

:arrow: Você pode replicar essa lógica para a outra rotina (use uma variável diferente, tipo PAUSA_2, para que os timers sejam independentes).


EDIT: Tinha esquecido de colocar a variável PAUSA com global. Foi corrigido no código acima.
User avatar
Gio
Posts: 1069
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Alternativa ao comando Sleep

28 May 2020, 17:09

Corrigi um pequeno problema no código acima: a variável PAUSA precisava ser declarada global dentro da função executa_acao1() (do contrário, não faria diferença para o loop externo o valor de 1 ser colocado nela dentro da função).
gilberto_san
Posts: 4
Joined: 28 May 2020, 12:28

Re: Alternativa ao comando Sleep

28 May 2020, 17:22

Uma coisa que não entendi foi como ficaria a segunda condição para que ela possa ser executada concomitante com a primeira.
Obs... irei ativar o macro usando F4 pois dentro do script maior ele vai trabalhar só em determinado momento (só quando for chamado :D ) e quando apertar o f4 preciso que essas duas condições fiquem sendo testadas e executadas em caso afirmativo.
User avatar
Gio
Posts: 1069
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Alternativa ao comando Sleep

29 May 2020, 11:58

Bom dia Gilberto_san.
Uma coisa que não entendi foi como ficaria a segunda condição para que ela possa ser executada concomitante com a primeira.
Basta repetir a lógica e criar rotinas semelhantes para a PAUSA_2.

Code: Select all

#Persistent ; Este comando é necessário se o script não tiver uma GUI ou hotkeys, pois do contrário ele terminará assim que estiver idle.
PAUSA := 0 ; Iniciamos o valor da variável em 0 (para executar a primeira vez assim que a outra condição for satisfeita).
PAUSA_2 := 0

Loop 
{
	testa_condicao1()
	if ((condicao1 = 1) AND (PAUSA = 0)) ; Passamos a ter uma segunda condição para executar a ação: a variável PAUSA tem que estar em 0 (ela já estará em 0 no início do script, então a primeira execução independe dela)
	{
		executa_acao1()
	}
	if ((condicao2 = 1) AND (PAUSA_2 = 0)) ; Passamos a ter uma segunda condição para executar a ação: a variável PAUSA tem que estar em 0 (ela já estará em 0 no início do script, então a primeira execução independe dela)
	{
		executa_acao2()
	}
 }


executa_acao1()
{
	Global PAUSA
	Tooltip, Exemplo
	Sleep 2000
	ToolTip, De rotina
	Sleep 2000
	ToolTip, Qualquer
	PAUSA := 1 ; Dentro da rotina colocamos a variável PAUSA em 1. Ao fazer isso, impedimos a rotina de executar novamente.
	SetTimer, DESLIGAR_PAUSA, 30000 ; Mas logo em seguida, ainda nesta rotina, ligamos um Timer de 30 segundos que vai zerar de novo a variável PAUSA.
}
Return


executa_acao2()
{
	Global PAUSA_2
	Tooltip, Exemplo
	Sleep 2000
	ToolTip, De rotina
	Sleep 2000
	ToolTip, Qualquer
	PAUSA_2 := 1
	SetTimer, DESLIGAR_PAUSA_2, 18000 ; AQUI SERÃO 18 SEGUNDOS.
}
Return


DESLIGAR_PAUSA:
PAUSA := 0 ; Aqui zeramos de novo a variável PAUSA.
SetTimer, DESLIGAR_PAUSA, Off ; e depois desligamos o Timer de 30 segundos.
Return

DESLIGAR_PAUSA_2:
PAUSA_2 := 0 ; Aqui zeramos de novo a variável PAUSA.
SetTimer, DESLIGAR_PAUSA_2, Off ; e depois desligamos o Timer de 30 segundos.
Return

:arrow: Se você precisar fazer mais rotinas condicionadas ainda, pode também criar funções e labels que possam tratar todas de uma só vez. Assim você não vai precisar ficar reescrevendo as linhas.
gilberto_san
Posts: 4
Joined: 28 May 2020, 12:28

Re: Alternativa ao comando Sleep

29 May 2020, 16:51

Ótima ajuda. Está desempenhando o que eu precisava, eu ainda estou abstraindo esse settimer. Em breve terei mais questionamentos.

Muito obrigado pela ajuda e por dedicar parte do seu tempo aqui. t+

Return to “Ajuda e Suporte Geral”

Who is online

Users browsing this forum: Gio and 6 guests