Ativo Pedaço Do Script.. Ele Desativa Outro Pedaço Topic is solved

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

Moderator: Gio

User avatar
Hologram
Posts: 129
Joined: 06 May 2020, 16:47

Ativo Pedaço Do Script.. Ele Desativa Outro Pedaço

26 May 2020, 08:06

Oquê estou fazendo errado aqui?
Se eu ativar por exemplo a tecla do "Combo1" tudo certo
Mas se eu ativar o combo1 e combo2, ele fica rodando somente o combo2 e desativa o combo1..

Code: Select all

Gui, Add, Button, x90 y0 w85 h25 gMENU_AIMBOT, Aimbot
Gui, Show, w430 h95, Test
return ; Aqui Terminam As Telas Do Menu Principal

MENU_AIMBOT:
Gui, New 
Gui, GuiName:New
Gui, Show, w530 h200, Auto-Aimbot

Gui, Add, Text, x100 y20, Combo 1
Gui, Add, CheckBox, gCombo_1 vCombo11 x300 y20, ON/OFF
Gui, Add, Edit, vCombo_1 x150 y20 w15 h15 Limit1 Uppercase
Gui, Add, Text, x190 y20, Delay
Gui, Add, Edit, x220 y20 vDelay_21 w35 h15

Gui, Add, Text, x100 y60, Combo 2
Gui, Add, CheckBox, gCombo_2 vCombo12 x300 y60, ON/OFF
Gui, Add, Edit, vCombo_2 x150 y60 w15 h15 Limit1 Uppercase
Gui, Add, Text, x190 y60, Delay
Gui, Add, Edit, x220 y60 vDelay_22 w35 h15

Gui, Add, Text, x100 y100, Combo 3
Gui, Add, CheckBox, gCombo_3 vCombo13 x300 y100, ON/OFF
Gui, Add, Edit, vCombo_3 x150 y100 w15 h15 Limit1 Uppercase
Gui, Add, Text, x190 y100, Delay
Gui, Add, Edit, x220 y100 vDelay_23 w35 h15

Gui, Add, Text, x100 y140, Combo 4
Gui, Add, CheckBox, gCombo_4 vCombo14 x300 y140, ON/OFF
Gui, Add, Edit, vCombo_4 x150 y140 w15 h15 Limit1 Uppercase
Gui, Add, Text, x190 y140, Delay
Gui, Add, Edit, x220 y140 vDelay_24 w35 h15

Gui, Add, Text, x100 y180, Combo 5
Gui, Add, CheckBox, gCombo_5 vCombo15 x300 y180, ON/OFF
Gui, Add, Edit, vCombo_5 x150 y180 w15 h15 Limit1 Uppercase
Gui, Add, Text, x190 y180, Delay
Gui, Add, Edit, x220 y180 vDelay_25 w35 h15

return

Combo_1:
Gui, submit, nohide
While (Combo11 = 1) ; O while está condicionado à variável da checkbox.
{
	Gui, submit, nohide
	Send, {%Combo_1%}
	Sleep, %Delay_21%
}
return

Combo_2:
Gui, submit, nohide
While (Combo12 = 1) ; O while está condicionado à variável da checkbox.
{
	Gui, submit, nohide
	Send, {%Combo_2%}
	Sleep, %Delay_22%
}
return

Combo_3:
Gui, submit, nohide
While (Combo13 = 1) ; O while está condicionado à variável da checkbox.
{
	Gui, submit, nohide
	Send, {%Combo_3%}
	Sleep, %Delay_23%
}
return

Combo_4:
Gui, submit, nohide
While (Combo14 = 1) ; O while está condicionado à variável da checkbox.
{
	Gui, submit, nohide
	Send, {%Combo_4%}
	Sleep, %Delay_24%
}
return

Combo_5:
Gui, submit, nohide
While (Combo14 = 1) ; O while está condicionado à variável da checkbox.
{
	Gui, submit, nohide
	Send, {%Combo_5%}
	Sleep, %Delay_25%
}
return



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

Re: Ativo Pedaço Do Script.. Ele Desativa Outro Pedaço  Topic is solved

26 May 2020, 11:50

Bom dia Hologram.


:arrow: Os computadores são baseados conceitualmente na chamada máquina de turing. Isso significa basicamente que eles executam instruções sequenciadas (que são os programas) em uma espécie de "linha de processamento" (chamada thread).

Até bem pouco tempo atrás, um computador só podia executar um único thread (ou seja, uma única linha de processamento de instruções), o que significa que você não poderia executar duas hotkeys ao exato mesmo tempo (por exemplo). Por conta dessa limitação (e em virtude da necessidade crescente de calcular muitas coisas "ao mesmo tempo"), as linguagens de programação passaram então a permitir uma espécie de "simulação" de várias linhas de processamento simultâneas. Isso é possível porque os computadores se tornaram rápidos o suficiente para "parecer ter múltiplos threads" se utilizarmos a velocidade deles da seguinte forma: ao chamar uma nova rotina enquanto outra está rodando, a primeira rotina será suspensa, de modo que a segunda inicie e rode até o fim e que logo depois a execução pule imediatamente de volta para a primeira iniciando exatamente onde parou (ou seja, não na primeira linha). Então se as rotinas forem executadas bem rápido, de fato vai parecer que ambas as rotinas ocorrem ao mesmo tempo.

Então enquanto a segunda rotina não termina, a primeira rotina não pode ser chamada de novo, porque ela na verdade já está em execução (porém suspensa). Ao terminar a segunda, a primeira volta a executar do ponto onde parou e somente então ela pode de fato terminar.

Em outras palavras, o que está ocorrendo com o seu script é exatamente a mesma coisa: Combo_1 é chamada e executa um while-loop infinito. Porém enquanto está executando esse while, Combo_2 é chamada. Com isso, Combo_1 é suspensa até o término de Combo_2. Mas como Combo_2 também executa um while-loop infinito, ela não termina nunca, o que significa que Combo_1 nunca volta a ser executada (a menos que você termine Combo_2 desmarcando o checkbox).

Mas conforme dito, existem nas linguagens de programação algumas opções para criar um comportamento onde ambas pareçam estar em execução simultânea. Na linguagem do AutoHotkey, Você pode por exemplo Pode trocar os while-loops por SetTimers com condicionais que os desliguem em virtude da checkbox ou então criar uma rotina que cuide da situação da forma que você achar melhor (ou seja, administrar o fluxo da execução para fazer as duas coisas), mas sempre deverá ter em mente essa questão dos threads.


Exemplo (usando o SetTimer para resolver a questão):

:arrow: Escolha intervalos entre 1 e 3 segundos para os tempos abaixo e verifique que de fato ele envia os dois combos:

Code: Select all

Gui, Add, Button, x90 y0 w85 h25 gMENU_AIMBOT, Aimbot
Gui, Show, w430 h95, Test
return ; Aqui Terminam As Telas Do Menu Principal

MENU_AIMBOT:
Gui, New 
Gui, GuiName:New
Gui, Show, w530 h200, Auto-Aimbot

Gui, Add, Text, x100 y20, Combo 1
Gui, Add, CheckBox, gCombo_1 vCombo11 x300 y20, ON/OFF
Gui, Add, Edit, vCombo_1 x150 y20 w15 h15 Limit1 Uppercase
Gui, Add, Text, x190 y20, Delay
Gui, Add, Edit, x220 y20 vDelay_21 w35 h15

Gui, Add, Text, x100 y60, Combo 2
Gui, Add, CheckBox, gCombo_2 vCombo12 x300 y60, ON/OFF
Gui, Add, Edit, vCombo_2 x150 y60 w15 h15 Limit1 Uppercase
Gui, Add, Text, x190 y60, Delay
Gui, Add, Edit, x220 y60 vDelay_22 w35 h15
return


Combo_1:
Gui, submit, nohide
SetTimer, EXECUTAR_COMBO_1, %Delay_21%
return

EXECUTAR_COMBO_1:
Gui, submit, nohide
If (Combo11 = 1)
{
	Send {%Combo_1%}
}
else
{
	SetTimer, EXECUTAR_COMBO_1, Off
}
Return

Combo_2:
Gui, submit, nohide
SetTimer, EXECUTAR_COMBO_2, %Delay_22%
return

EXECUTAR_COMBO_2:
Gui, submit, nohide
If (Combo11 = 1)
{
	Send {%Combo_2%}
}
else
{
	SetTimer, EXECUTAR_COMBO_2, Off
}
Return

:arrow: Mas porque o SetTimer funcionou? :?:

Simples: é que como não estamos usando um while-loop infinito, o SetTimer executa uma vez e depois de fato termina até ser chamado de novo pelo lapso do tempo de espera. Então se a rotina roda em 30ms com intervalo de 2000ms (2 segundos), durante ~1970ms o script pode executar outras rotinas normalmente (inclusive as que tiverem sido suspensas). A rotina anterior tinha um Sleep para controlar o intervalo, mas diferente do SetTimer o sleep NÃO termina a rotina atual e nem permite ao script voltar ao thread suspenso. Então o que você fazer é usar o SetTimer pra controlar o intervalo (e não coloque nenhum sleep) e também não colocar um loop-infinito, ou seja, não faça com que uma rotina tenha uma linha de execução infinita se você quer rodar outra rotina junto com ela.


Tendo dito tudo isto vale a pena destacar uma coisa agora: hoje em dia (e desde os anos 2000 mais ou menos) os computadores pessoais já são de fato capazes de rodar múltiplas linhas de execução (threads) em paralelo. O problema é que isso não é necessariamente tão útil quanto parece pois como vimos, uma simples alteração na lógica do script já pode resolver os problemas de ter um único thread em execução (já que os computadores são bem rápidos). Além disso, quando você trabalha com múltiplos threads (multi-threading) você tem que tomar muito cuidado com os problemas que o paralelismo pode gerar, uma vez que um thread pode terminar mais rápido que o outro (e vice-versa) sem que você tenha muito controle sobre isso, de modo que fica difícil sincronizar as tarefas de múltiplos threads. Em algumas aplicações, no entanto, o multi-threading pode ser uma boa vantagem, como é o caso de jogos, em que rodar os cálculos da física em um thread e a renderização em outro pode funcionar muito bem. Os processadores atuais estão migrando cada vez mais para um número maior de cores (e portanto threads) verdadeiramente simultâneos permitidos, de modo que computadores hexacore, por exemplo, poder rodar 6 linhas de execução simultâneamente. Nem todos os programas podem fazer uso de mais de um core/thread, mas isso não é problema pois os sistemas operacionais (Windows) atuais já vão ajudar jogando o tempo de execução de outros programas em outros threads. Mas se você precisar mesmo desenvolver um aplicativo com multi-threading em AutoHotkey, saiba que a versão AutoHotkey_H permite essa funcionalidade. Do contrário, recomendo ficar sempre com um único thread enquanto você puder solucionar todos os problemas somente administrando a linha de execução, pois daí você não terá que lidar com os problemas do paralelismo.
User avatar
Hologram
Posts: 129
Joined: 06 May 2020, 16:47

Re: Ativo Pedaço Do Script.. Ele Desativa Outro Pedaço

26 May 2020, 16:15

Gio, uma ultima duvida:

No meu script cada botao é responsavel por fazer tal coisa ( que são +,- repartidas em 12 botoes) eu creio que o pessoal vai querer sim usar todos ao mesmo tempo, por exemplo matar o monstro, clicar no corpo, e lotear.. são 3 botoes diferentes, ai entra oq tu falou sobre lidar com os problemas do paralelismo, e se no lugar de eu fazer apenas um script.. cada botao do Menu principal levasse a um script secundario, eu teria algum tipo de problema?

Exemplo:

ScriptPrincipal

Code: Select all

Gui, Add, Button, x0 y0 w85 h25 gMENU_CHAMADA1, Chamada
Gui, Add, Button, x0 y24 w85 h25 gMENU_CHAMADA2, Chamada2
Gui, Show, w430 h95, Test
return ; Aqui Terminam As Telas Do Menu Principal

MENU_CHAMADA1:
Run, %A_ScriptDir%/chamada1.ahk
return

MENU_CHAMADA2:
Run,%A_ScriptDir%/chamada2.ahk :
return



chamada1.htk

Code: Select all

Gui, Add, Text, x100 y20, Combo 1
Gui, Add, CheckBox, gCombo_1 vCombo11 x300 y20, ON/OFF
Gui, Add, Edit, vCombo_1 x150 y20 w15 h15 Limit1 Uppercase
Gui, Add, Text, x190 y20, Delay
Gui, Add, Edit, x220 y20 vDelay_21 w35 h15
Gui, Show, w430 h95, Test
return ; Aqui Terminam As Telas Do Menu Principal

Combo_1:
Gui, submit, nohide
While (Combo11 = 1) ; O while está condicionado à variável da checkbox.
{
	Gui, submit, nohide
	Send, {%Combo_1%}
	Sleep, %Delay_21%
}
return



chamada2.htk

Code: Select all

Gui, Add, Text, x100 y60, Combo 2
Gui, Add, CheckBox, gCombo_2 vCombo12 x300 y60, ON/OFF
Gui, Add, Edit, vCombo_2 x150 y60 w15 h15 Limit1 Uppercase
Gui, Add, Text, x190 y60, Delay
Gui, Add, Edit, x220 y60 vDelay_22 w35 h15
Gui, Show, w430 h95, Test
return ; Aqui Terminam As Telas Do Menu Principal

Combo_2:
Gui, submit, nohide
While (Combo12 = 1) ; O while está condicionado à variável da checkbox.
{
	Gui, submit, nohide
	Send, {%Combo_2%}
	Sleep, %Delay_22%
}
return
Discord: Npc Bugado#9074



local config = {
delrey = getPlayerCarValue(cid, DELREY),
cigarro = getPlayerCancer(cid, DERBY),
prostituta = getPlayerAIDS(cid, cracuda),
tresOitao = getPlayerRevorvi(cid, 38)
}
if(delrey == "Ligado" and cigarro == "Aceso" and prostituta == "No Colo" and tresOitao == "Carregado") then
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Começou o fim de semana. #PAS")
end


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

Re: Ativo Pedaço Do Script.. Ele Desativa Outro Pedaço

26 May 2020, 18:52

e se no lugar de eu fazer apenas um script.. cada botao do Menu principal levasse a um script secundario, eu teria algum tipo de problema?
Acho que você pode fazer um teste pra ver.

Quando roda vários scripts, você tem uma execução assíncrona. Isso pode trazer muitos problemas e dificuldades de implementação sim, mas as vezes você consegue fazer o que quer sem maiores problemas também. Eu não recomendo essa via se houverem alternativas. Costumo usar apenas 1 script por projeto para manter o controle da execução e já escrevi scripts bastantes complexos dessa forma.

Return to “Ajuda e Suporte Geral”

Who is online

Users browsing this forum: No registered users and 3 guests