Compensação de Atraso

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

Moderator: Gio

User avatar
juanmuscaria
Posts: 65
Joined: 29 Oct 2017, 10:53
Location: Brazil
Contact:

Compensação de Atraso

17 Nov 2018, 19:06

Teria algo capaz de detectar quanto tempo o script leva para execução de cada linha e fazer um auto ajuste com o SetBatchLines para manter uma execução fixa sem flutuação de delay?
Obs:
Deixar o SetBatchLines -1 não é uma opção pois eu uso linux e o script executa absurdamente rápido quase ignorando os delays.
User avatar
Gio
Posts: 1247
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Compensação de Atraso

19 Nov 2018, 11:19

Bom dia Juanmuscaria.

Não existe um parâmetro assim em praticamente nenhuma linguagem de alto nível. Isso ocorre porque os comandos das linguagens de alto nível não são 1:1 com as instruções do processador, de modo que uma única linha pode executar milhares de instruções ou apenas algumas poucas. Além disso, muitos comandos efetuam chamadas às APIs, que por sua vez também executam números variáveis de instruções.

:arrow: Por este motivo, é que a gestão do tempo de execução é um papel do próprio sistema operacional, ou seja, é ele quem determina quanto dos recursos disponíveis será direcionado para cada processo, aumentando ou diminuindo a velocidade de execução de cada programa conforme hajam recursos disponíveis para isso.

Tendo dito isto, se você quiser simplesmente executar as linhas em um intervalo regular, ainda pode fazer isso, embora tenha que na verdade reduzir a velocidade das linhas mais rápidas de modo a chegar à velocidade das mais lentas, o que não costuma ser o ideal.

Se quiser fazer mesmo assim, sugiro utilizar a variável embutida A_TickCount. Ela contém basicamente o número de milisegundos desde a última vez que o computador foi reiniciado. Assim, a diferença entre o valor dessa variável antes e depois de uma linha ou rotina é uma métrica boa para o tempo de execução dessa linha ou rotina. Também deve ser possível utilizar um while-loop para checar se a diferença no A_TickCount já chegou a um valor qualquer e prosseguir somente então.

:arrow: Exemplo: o código abaixo executa a segunda msgbox dez segundos após abrir a primeira (ou assim que a primeira for fechada caso ela fique aberta por mais de 10 segundos).

Code: Select all

Start := A_TickCount
msgbox % "first!"
While ((A_TickCount - Start) < 10000)
{
	Continue
}
msgbox % "Second!"
Veja que o comportamento do código acima é totalmente diferente de um código que use Sleep, 10000. Isso ocorre porque o comando Sleep vai sempre esperar 10 segundos DEPOIS de você fechar a primeira msgbox.

Code: Select all

Start := A_TickCount
msgbox % "first!"
Sleep, 10000
msgbox % "Second!"

Return to “Ajuda e Suporte Geral”

Who is online

Users browsing this forum: No registered users and 42 guests