Page 1 of 1

Fazer mais de uma coisa ao mesmo tempo...

Posted: 04 Oct 2019, 09:08
by Nauany
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?

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

Posted: 04 Oct 2019, 12:01
by Gio
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:

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

Posted: 04 Oct 2019, 15:36
by Nauany
entendi, muito obrigado man!!
usei esse SetTimer e deu certo =D

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

Posted: 05 Oct 2019, 09:08
by Nauany
@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?

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

Posted: 07 Oct 2019, 10:00
by Gio
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 2581 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.

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

Posted: 07 Oct 2019, 10:28
by Nauany
ahh sim, abri aqui pra ver agora, e realmente usa mesmo..
:D