Page 1 of 1

Verificação de tempo após uma action

Posted: 27 Jun 2022, 20:08
by caiomesq
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

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

Posted: 28 Jun 2022, 10:33
by Gio
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.