Boa noite,
Tenho um código que é basicamente um looping que é executado durante toda a duração da aplicação, e a cada iteração tem que pausar por alguns milissegundos.
Consegui implementar este comportamento utilizando um "busy wait", porém às vezes a aplicação congela, acredito que seja pelo excesso de processamento causado por esse código.
Cheguei a olhar a parte de threads da linguagem, mas não achei nenhum "coroutine.yield(milissegundos)" por exemplo.
Também tentei uma lógica utilizando a função event.timer, o timer dela funciona bem, mas ela não pausa a thread que dispara o evento.
Alguém já conseguiu implementar este comportamento ou tem alguma sugestão de como faze-lo?
Obrigado!
Autor: Rafael Pinto
33 comentários
Se vc usar o event.timer() passando como parametro o tempo em milisegundos q vc ker e uma funcao f, essa funcao será executada após o tempo q vc colocou. Assim,acredito q seu problema pode ser resolvido atribuindo a essa função f a responsabilidade de dar continuar sua coroutine. Mais ou menos assim:
function f()
coroutine.resume(MINHA_FUNCAO)
end MINHA_FUNCAO = coroutine.create( function()
--código da sua função aki. Linhas abaixo dentro do seu loop:
event.timer(f,1000) -- espera 1 segundo e chama f
coroutine.yield() -- para a funcao atual
end
) Assim, após 1 segundo, nesse exemplo, a função deve retornar. Se n estou enganado a função timer n bloqueia a execucao do Lua, certo? Isto é, a linha coroutine.yield() deve executar antes da funcao f. Se for assim, deve funcionar. Tenta ai e diz se serviu...
function f()
print('reiniciando looping...')
coroutine.resume(MINHA_FUNCAO)
end
MINHA_FUNCAO = coroutine.create(
function()
local i = 0
while i < 10 do
print(i)
event.timer(1000, f) -- espera 1 segundo e chama f
coroutine.yield() -- para a funcao atual
end
end
) coroutine.resume(MINHA_FUNCAO)
end event.register(handler) O único problema é que a função MINHA_FUNCAO não volta a ser executada, sai no log: 0
reiniciando looping...
E fica assim. Alguma sugestão? Obrigado!