Fazer mais de uma coisa ao mesmo tempo... Topic is solved

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

Moderator: Gio

Nauany
Posts: 58
Joined: 12 Dec 2016, 01:37

Fazer mais de uma coisa ao mesmo tempo...

04 Oct 2019, 09:08

Bom dia, estou com problema em uma coisa, até pensei ter resolvido e exclui um post desse que havia feito porém n deu certo, bom vamos la...
Eu uso um script para healar no jogo, ele tem 2 opções diferentes para curar, sendo uma com magia, e outra com potion.
Ambas tem colldown diferentes, ou seja, eu posso usar uma magia de cura e uma potion ao mesmo tempo.
Meu problema é que meu script ele esta checando a minha vida perfeita, usando a magia perfeita, e usando a potion perfeita, mas quando é para usar a magia e a potion juntas, ele n à faz... ou usa um ou usa outro...
Muitas vezes ele está em um "Sleep" de um tipo de cura, por isso n usa o outro ao mesmo tempo.
E eu n poderia junta-los, pois tem 2 ou 3 tipo de magias de cura que ele checa, e 2 ou 3 tipos de potions que ele checa para usar na sua devida necessidade...
teria alguma forma de eu coloca-los para fazerem ao mesmo tempo, ignorando o outro tipo de cura?
User avatar
Gio
Posts: 1247
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Fazer mais de uma coisa ao mesmo tempo...  Topic is solved

04 Oct 2019, 12:01

Bom dia Nauany.

Bom, não conheço o jogo a que você se refere, mas pelo que você descreveu, entendo que o script está operando um comando Sleep ao final de uma rotina e isso está impedindo-o de efetuar uma nova checagem até que o sleep termine.

De fato, este é o comportamento do comando Sleep. Ele basicamente "adormece" o script inteiro pelo tempo indicado. Então se você precisa que o script faça alguma outra coisa durante o período de cooldown, você deve elaborar uma rotina diferente.

Eis alguns exemplos do que você pode usar para elaborar uma rotina de cooldown que não interrompe o script inteiro:

1. SetTimer.
O comando SetTimer roda uma rotina a cada X milisegundos (ou seja, ele roda e depois espera os X milisegundos para rodar novamente, mas enquanto espera, o script continua ativo, fazendo o que mais estiver programado). No exemplo a seguir, uma mensagem é exibida a cada 3 segundos e a outra a cada 10 segundos. Veja que a espera de uma não interrompe a espera da outra.

Code: Select all

#Persistent

SetTimer, OLA, 10000
SetTimer, OI, 3000
Return

OLA:
ToolTip, Olá teste
Return

OI:
ToolTip, Oi testando
Return
2. Loop, If, A_Now
Você pode criar uma rotina em loop que não faz nada enquanto um tempo X não passar. Isso pode ser feito comparando o tempo da última vez que a rotina rodou com o tempo atual
do relógio do computador (e agindo somente se a diferença for maior que um determinado valor, do contrário simplesmente deixa reiniciar o loop).

Code: Select all

#Persistent

TEMPO_CURA := A_Now
TEMPO_POCAO := A_Now ; Tempo inicial para comparação.

Loop
{
	If (A_Now - TEMPO_CURA >= 3)
	{
		ToolTip, 3 segundos se passaram da cura!
		TEMPO_CURA := A_Now
	}
	If (A_Now - TEMPO_POCAO >= 10) ; Compara o tempo atual com o tempo anterior. Se a diferença for maior ou igual a 10 segundos, executa o bloco abaixo.
	{
		ToolTip, 10 segundos se passaram da poção!
		TEMPO_POCAO := A_Now ; Sempre que rodar a rotina, devemos reconfigurar o tempo anterior para ser o tempo daquele momento (para fazer uma nova espera com o if)
	}
}
:arrow: Tente modificar seu script para implementar esperas mais inteligentes nas rotinas, como as demonstradas acima. Se após tentar ainda tiver alguma dúvida poste o código dele para que possa verificar o que pode ser feito :thumbup:
Nauany
Posts: 58
Joined: 12 Dec 2016, 01:37

Re: Fazer mais de uma coisa ao mesmo tempo...

04 Oct 2019, 15:36

entendi, muito obrigado man!!
usei esse SetTimer e deu certo =D
Nauany
Posts: 58
Joined: 12 Dec 2016, 01:37

Re: Fazer mais de uma coisa ao mesmo tempo...

05 Oct 2019, 09:08

@Gio bom dia meu irmão, estava pensando aqui e surgiu uma dúvida.
se eu colocar um sleep dentro de um settimer, ele causara colldown no programa inteiro?


por exemplo:

Code: Select all


#Persistent

SetTimer, OLA, 10000
SetTimer, OI, 3000
Return

OLA:
ToolTip, Olá teste
Sleep, 2000
ToolTip, Olá novamente
Return

OI:
ToolTip, Oi testando
Return
claro que ao invéz de 10 segundos que seriam o "OLA" ali, mudariam para 12...
porém isso influenciaria o "OI" também?
User avatar
Gio
Posts: 1247
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Fazer mais de uma coisa ao mesmo tempo...

07 Oct 2019, 10:00

Bom dia Nauany.

Esse tipo de dúvida é relativamente simples de ser tirada com um teste.

Na configuração padrão, o SetTimer suspende a rotina em andamento mesmo que ela esteja executando um Sleep.

Exemplo: No script abaixo, um Sleep, 20000 (20s) foi interrompido pela rotina do SetTimer aos 8.95s:

TESTE SETTIMER.png
TESTE SETTIMER.png (8.62 KiB) Viewed 2568 times

Code: Select all

#Persistent

SetTimer, OLA, 1000
SetTimer, OI, 10000
Return

OLA:
ToolTip, Olá teste
Sleep 20000
Return

OI:
ToolTip, Oi testando
Return

:arrow: Cabe destacar que no AutoHotkey existem configurações para ajustar a interruptibilidade de threads específicos. No caso do comando SetTimer, por exemplo, existe inclusive um parâmetro no próprio comando que controla a prioridade dele.
Nauany
Posts: 58
Joined: 12 Dec 2016, 01:37

Re: Fazer mais de uma coisa ao mesmo tempo...

07 Oct 2019, 10:28

ahh sim, abri aqui pra ver agora, e realmente usa mesmo..
:D

Return to “Ajuda e Suporte Geral”

Who is online

Users browsing this forum: No registered users and 42 guests