Verificação de tempo após uma action

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

Moderator: Gio

caiomesq
Posts: 4
Joined: 13 Feb 2021, 10:53

Verificação de tempo após uma action

Post by caiomesq » 27 Jun 2022, 20:08

Olá, preciso de uma ajuda com um script, não consigo pensar em uma forma de faze-lo...

Então, o que eu estou querendo fazer é o seguinte...

1° Quero que o script use o ImageSearch para verificar uma imagem na tela, isso eu já tenho pronto..
2° Após a verificação da Imagem ele executa uma Hotkey, até ai é moleza..

o problema começa agora...

Após verificar a Imagem ele executa a hotkey, porém, pra executar essa hotkey novamente eu teria que esperar 10 segundos e dentro desses 10 segundos eu quero que ele mude e use outra Hotkey,

Exemplo:

Script Verificou a imagem e executou a Hotkey (F1), verificou novamente, porém, a hotkey (F1) ta em cooldown 10sec, então executar Hotkey(F2)...

Se alguém puder me iluminar.... agradeço

User avatar
Gio
Posts: 1247
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Verificação de tempo após uma action

Post by Gio » 28 Jun 2022, 10:33

Bom dia Caiomesq.

Você pode usar a variável embutida A_tickCount para isso. Ela contém o número aproximado de milisegundos desde a inicialização do sistema, logo, você pode:

1. Salvar o valor dela em algum momento da execução em outra variável
2. Substrair a qualquer tempo o valor dela (que é sempre atualizado) de qualquer das variáveis salvas para encontrar a diferença de tempo em milisegundos entre aquele momento e o momento atual.

Um exemplo básico:

Code: Select all

msgbox, 0, aviso, vamos iniciar uma contagem de 5 segundos após você clicar em ok...
TEMPO_INICIAL := A_tickCount
Sleep 5000
TEMPO_FINAL := (A_tickCount - TEMPO_INICIAL) / 1000
msgbox, 0, aviso, Passaram-se %TEMPO_FINAL% segundos.


:arrow: No script acima veja que nós não salvamos o tempo do sleep em variável nenhuma, logo, o resultado obtido adveio exclusivamente da diferença entre os valores da variável A_tickCount no início da execução e após a execução. Mas como sabemos que o sleep foi de 5 segundos, podemos comprovar que de fato o cálculo das variáveis é bastante preciso. Agora vamos aplicar isso em um processo diferente, no qual não sabemos o tempo que vai demorar, mas sabemos que teremos a informação do mesmo jeito no final do processo:

Code: Select all

msgbox, 0, aviso, Agora nós vamos contar o tempo necessário para incrementar uma variável 5 milhões de vezes (OBS: sem usar SetBatchLines!)
TEMPO_INICIAL := A_tickCount
Var := 0
loop 5000000
{
	Var++
}
TEMPO_FINAL := (A_tickCount - TEMPO_INICIAL) / 1000
msgbox, 0, aviso, Passaram-se %TEMPO_FINAL% segundos.

:arrow: Portanto, no script acima, o tempo exibido na segunda msgbox é de fato o tempo que o script levou para incrementar uma variável 5 milhões de vezes (sem usar SetBatchLines, -1). Viu como foi possível contar o tempo de um processo usando a variável embutida A_tickCount?

OBS: Em ambos os scripts a divisão por 1000 é necessária porque o tempo é contado em milisegundos (milésimos de segundo) e queremos exibir a informação em segundos.


Agora vamos usar isso para implementar o esquema de "cooldown" de 5 segundos em uma hotkey...

No script abaixo, a hotkey F2 ativa uma mensagem de parabéns. Se a última vez que a mensagem ativou tiver mais de 5 segundos ela te dá parabéns de novo. Mas se tiver menos de 5 segundos, ela te dá um erro.

Code: Select all

F2::
TEMPO_ATUAL := A_tickCount
If (ULTIMO_TEMPO = "")
{
	msgbox, 0, Aviso, Parabéns !! Essa é a primeira vez que você pressiona F2.
	ULTIMO_TEMPO := A_TickCount
	Return
}
If (TEMPO_ATUAL - ULTIMO_TEMPO > 5000)
{
	msgbox, 0, Aviso, Parabéns !! Já faz MAIS DE 5 SEGUNDOS que você foi parabenizado.
	ULTIMO_TEMPO := A_TickCount
	Return
}
msgbox, 0x10, ERROU, Você foi parabenizado há menos de 5 segundos, espere o cooldown terminar !!
Return

:arrow: Perceba que há ainda uma outra possibilidade: poderíamos (se quisessemos) reiniciar o contador quando o usuário pressionasse F2 antes de 5 segundos. Para fazer isso bastaria salvar novamente o valor de A_TickCount em ULTIMO_TEMPO antes do return final.

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

Post Reply

Return to “Ajuda e Suporte Geral”