Atualizar em segundo plano

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

Moderator: Gio

claudiosxj
Posts: 11
Joined: 08 Dec 2020, 12:41

Atualizar em segundo plano

08 Dec 2020, 13:04

Boa tarde! venho aprendendo bastante coisa no fórum, gostaria de agradecer a todos


Agora a minha dúvida, Eu to fazendo uma aplicação que uma boa parte da empresa onde eu trabalho faz uso, eu estava fazendo atualização no programa através do FileCopy, usando uma pasta compartilhada na rede interna, só que essa pasta ficava indisponível frequentemente, então eu mudei minha função de atualização para baixar um arquivo do google drive por URLDownloadToFile, só que eu tenho um problema, toda vez que o programa é executado ele tem que fazer o download de um aquivo para verificar a versão, e esse procedimento demora um pouco, gostaria de saber se tem como fazer isso de uma forma mais rápida ou fazer em segundo plano, o meu problema acontece por que eu tenho bastante Reload dentro do programa, então esse tempo para abrir o programa acaba incomodando bastante.

Para diminuir esse tempo de espera eu baixo apenas um txt com 4 linhas nele vai estar o número da versão mais atual, então ele verifica se os arquivos locais etão na ultima versão, se houver alguma diferença então ele baixa os demais arquivos.

Code: Select all

HmcAtt(){
	
	SplashTextOn, 200, 100, CERREGANDO - %versaoAtual%, Só um instantinho que estamos abrindo as portas `n`n`n %versaoAtual% - Claudio Bocato
	WinMove, CERREGANDO - %versaoAtual%, , 0, 0 

	URLDownloadToFile, http drive.google.com /uc?export=download&id=1xAQ0R5zo6lOOcpiGiCO8i0KlytDtl2jt,%A_Temp%/version_new.txt  Broken Link for safety
	if ErrorLevel{	
		MsgBox, 48, Download ERROR!! (version_new.txt), Erro ao baixar Arquivo essencial.`nUsando arquivos locais existentes
	}else{
		FileDelete,%A_Temp%/version.txt
		FileMove, %A_Temp%/version_new.txt, %A_Temp%/version.txt
		
		FileReadLine, version_data, %A_Temp%/version.txt, 3
		FileReadLine, version_data2, %A_Temp%/data.txt, 1
		
		if(version_data != version_data2 ){
			
			URLDownloadToFile, http drive.google.com /uc?export=download&id=1GPhqnDyPObx5MOyyRqdpGkDTgOtNR2LF,  Broken Link for safety %A_Temp%/data_new.txt
			if ErrorLevel{	
				MsgBox, 48, Download ERROR!! (data_new.txt), Erro ao baixar Arquivo essencial.`nUsando arquivos locais existentes
			}else{
				
				FileDelete,%A_Temp%/data.txt
				FileMove, %A_Temp%/data_new.txt, %A_Temp%/data.txt
				
			}
		}
		
		FileReadLine, version_servidores, %A_Temp%/version.txt, 4
		FileReadLine, version_servidores2, %A_Temp%/servidores.ini, 1
		
		if(version_servidores != version_servidores2){
			
			
			
			URLDownloadToFile, http drive.google.com /uc?export=download&id=1yAHtLyG0YA_Smk6mG1-ktYcb196gBklS,  Broken Link for safety %A_Temp%/servidores_new.ini
			if ErrorLevel{	
				MsgBox, 48, Download ERROR!! (servidores_new.ini), Erro ao baixar Arquivo essencial.`nUsando arquivos locais existentes
			}else{
				
				FileDelete,%A_Temp%/servidores.ini
				FileMove, %A_Temp%/servidores_new.ini, %A_Temp%/servidores.ini
				
			}
			
			
		}
	}
	
	FileReadLine, version, %A_Temp%/version.txt, 1
	FileReadLine, link_novoHMC, %A_Temp%/version.txt, 2
	
	if (version = versaoAtual) { 
		FileDelete, version.txt
		FileDelete, %versaoAntiga%.exe
	} else {
		URLDownloadToFile, http drive.google.com /uc?export=download&id=%link_novoHMC%,  Broken Link for safety %A_ScriptDir%/%version%.exe
		msgbox,Existe uma nova versão! `n`nversão Nova: %version%
		FileDelete, version.txt
		MsgBox, 36, Continuar?, Deseja continuar usando esta versão antiga %versaoAtual% ?? 
		IfMsgBox Yes
			return
		else
			msgbox, Abrindo a nova versão %version%!!!
		Run,%version%.exe
		ExitApp
		return
	}
	
	SplashTextOff
}
Gostaria de fazer essa atualização em segundo plano, pensei em Thread mas não consegui aplicar! por favor se puder me ajudar.
claudiosxj
Posts: 11
Joined: 08 Dec 2020, 12:41

Re: Atualizar em segundo plano

08 Dec 2020, 13:54

Essa é minha função que verifica a entrada de dado do usuário, se ele clicar em cancelar ele volta para a label e continua o código mesmo sem nenhuma informação então eu dou um Reload quando clica em cancelar, mas então ele demora para abrir novamente pois tem que fazer o download.

Code: Select all

verifica_entrada(UserInput,string,string2){
	
	
	while(UserInput =""){
		InputBox, UserInput, %string%,%string2%,,400,300,,,,
		dado =%UserInput%
		if ErrorLevel{
			MsgBox, Processo Cancelado!
			IniWrite, %tab%, %A_Temp%/%BD_Atual%, DADOS,TAB
			Reload
			
		}
	}
	
	
	return dado
}
Se tiver como eu parar o script quando clicar em cancelar resolve meu problema, pois ele vai fazer o download só quando abrir o programa e então a espera não gera problema.
User avatar
Gio
Posts: 1248
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Atualizar em segundo plano

08 Dec 2020, 18:59

Boa tarde Claudiosxj.

Seja bem-vindo ao fórum da comunidade do AutoHotkey.
toda vez que o programa é executado ele tem que fazer o download de um aquivo para verificar a versão, e esse procedimento demora um pouco, gostaria de saber se tem como fazer isso de uma forma mais rápida ou fazer em segundo plano

Você pode otimizar essa rotina de várias formas. Pode por exemplo começar deixando de escrever os arquivos novos no disco e apenas baixando os dados do arquivo para variáveis. Daí você lê direto dessas variáveis as informações necessárias.

Exemplo:

Code: Select all

whr := ComObjCreate("WinHttp.WinHttpRequest.5.1")
whr.Open("GET", "https://drive.google.com/uc?export=view&id=1xAQ0R5zo6lOOcpiGiCO8i0KlytDtl2jt", true)
whr.Send()
whr.WaitForResponse()
CONTEUDO_DO_ARQUIVO := whr.ResponseText
MsgBox % CONTEUDO_DO_ARQUIVO ; CONTEUDO COMPLETO DO ARQUIVO BAIXADO.

StringSplit, LINHA_, CONTEUDO_DO_ARQUIVO, `n ; COM ESTA LINHA, DIVIDIMOS O ARQUIVO EM LINHAS
MsgBox % LINHA_3 ; A VARIÁVEL LINHA_3 AGORA CONTERÁ OS DADOS QUE VOCÊ ESTAVA COMPARANDO.

Mas não recomendo o uso do Reload da forma como você descreveu. Vale sempre mais a pena escrever os caminhos que o programa deve adotar quando o usuário de comportar de outras formas (por exemplo, escreva o código de retorno à tela anterior ou coisa parecida).

SEGUNDA PERGUNTA:
se ele clicar em cancelar ele volta para a label e continua o código mesmo sem nenhuma informação

Não entendi porque você disse que ele voltaria para a label. Como você colocou um While-loop na rotina, se ele clicar em Cancel ou tentar fechar a janela do inputbox, na verdade o script vai apenas abrir outro inputbox.

Exemplo simplificando seu código (clique em cancelar, fechar ou qualquer outro botão que não seja OK com alguma coisa escrita e o inputbox ressurgirá):

Code: Select all

	while(UserInput =""){
		InputBox, UserInput, %string%,%string2%,,400,300,,,,
		dado =%UserInput%
		if ErrorLevel{
			MsgBox, Processo Cancelado!
		}
	}
claudiosxj
Posts: 11
Joined: 08 Dec 2020, 12:41

Re: Atualizar em segundo plano

09 Dec 2020, 07:56

Bom dia!, primeiramente queria agradecer, mesmo sem saber você ja me ajudou muito com seus tutoriais e resposta a dúvidas de outra pessoa, Obrigado!


Seguinte eu já tentei usar essa alternativa de salvar o os dados em uma variável, mas infelizmente eu preciso do arquivo em disco, pois caso não tenha conexão com a internet o programa precisa continuar funcionando, mas agradeço muito essa sua explicação, pois agora eu sei como tratar os dados em uma variável, com essa Stringsplit.

Vou tentar solucionar o problema com o Reload, dessa forma se toda vez que abrir ele demorar um pouco não vai ter problema ele não vai ficar dando reload todo tempo, Vou explicar melhor o problema, e tentar fazer um pegunta digna da sua resposta.

:arrow: Primeiro o usuário clica no botão da minha GUI e o direciona para ma label, correto?
imagem_2020-12-09_094433.png
imagem_2020-12-09_094433.png (23.59 KiB) Viewed 554 times
:arrow: Por exemplo essa label, que acontece quando o usuário clica em um botão.

Code: Select all

SERVICE_PORT_DA_ONU:
tab=2
;-- ver se onu tem service-port


MsgBox,0, INFORMAÇÕES!, Verificar e trocar Service-port da ONU!`n`nÉ nescessário Slot,PON e ID da ONU`n`nAperte CTRL+'' para PARAR a qualquer momento!

verifica_entrada(UserInput,"Verificar e trocar Service-port da ONU!","Digite somente o número do Slot! `n`nExemplo: 12`n`n**Aperte CTRL+'' para PARAR a qualquer momento!**")
slot =%dado%
verifica_entrada(UserInput,"Verificar e trocar Service-port da ONU!","Digite a PON da ONU! `n`nExemplo: 12`n`nProgresso:0/" slot "/--`n`n**Aperte CTRL+")
pon =%dado%
verifica_entrada(UserInput,"Verificar e trocar Service-port da ONU!","Digite o ID da ONU! `n`nExemplo: 12`n`nProgresso:0/" slot "/" pon "`n`n**Aperte CTRL+")
id =%dado%
ativarconsole()
Send,display service-port port 0/%slot%/%pon% ont %id%
Sleep, 400
Send, {ENTER}
Sleep, 400
Send, {ENTER}
:arrow: O problema acontece que caso a pessoa clique em cancelar ou feche o box de entrada, o programa volta para a Label e continua executando o código, o que eu não quero que aconteça, então eu coloquei o Reload para ele finalizar a execução, existe a possibilidade de fazer isso? sinceramente eu não consegui pensar em nada para resolver, estou trabalhando nessa rotina a um bom tempo.
claudiosxj
Posts: 11
Joined: 08 Dec 2020, 12:41

Re: Atualizar em segundo plano

09 Dec 2020, 13:08

Eu resolvi o problema da seguinte forma:

Code: Select all

VER_PON_INTELBRAS:
tab=7
Gui, submit, NoHide

verifica_entrada(UserInput,"Adicionar ONU!","Digite somente o número do Slot! `n`nExemplo: 12`n`n**Aperte CTRL+'' para PARAR a qualquer momento!**")
slot =%dado%


if(dado = 010203)
	return


verifica_entrada(UserInput,"Adicionar ONU!","Digite somente o número do a Pon! `n`nExemplo: 12`n`nProgresso:0/" slot "/--`n`n**Aperte CTRL+' para PARAR a qualquer momento!**")
pon =%dado%

Sleep,400
ativarconsole_intelbras()
Send,port description list 1/%slot%/%pon%
Sleep, 400
Send, {ENTER}
Sleep, 400

return

:arrow: Eu colocaria um if em baixo de cada função de verificar entrada, o que ficaria bem ruim pois essa função é muito repetida no código, se eu conseguir resolver dentro da própria função, verifica_entrada() ficaria melhor.
User avatar
Gio
Posts: 1248
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Atualizar em segundo plano

14 Dec 2020, 10:22

Bom dia Claudiosxj.

Não é possível terminar um thread suspenso por um segundo thread a partir desse segundo thread. A função deve retornar e depois o código da label que a chamou deve conter o código para se auto-terminar caso a resposta retornada pela função seja diferente da esperada.

Nesse caso a condicional que você usou de fato é uma solução adequada para que a label VER_PON_INTELBRAS possa decidir algo a partir do retorno da função verifica_entrada().

Return to “Ajuda e Suporte Geral”

Who is online

Users browsing this forum: No registered users and 15 guests