Ir para o conteúdo

 Voltar a Linguagem Lua
Tela cheia

Pausar execução do código lua (sleep, wait, etc)

4 de Junho de 2009, 18:42 , por Desconhecido - | Ninguém seguindo este artigo por enquanto.
Visualizado 1331 vezes

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

  • B6b3cae0711e1cd6e59c07cc4b342f8b?only path=false&size=50&d=404José Ricardo Júnior(usuário não autenticado)
    5 de Junho de 2009, 11:44

     

    Rafael,
    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... 

    • B6b3cae0711e1cd6e59c07cc4b342f8b?only path=false&size=50&d=404José Ricardo Júnior(usuário não autenticado)
      5 de Junho de 2009, 11:46

       

      correção:  event.timer(1000,f) ao invés de event.timer(f,1000)

      • 0e0bb701f1b73af0bdb5e06871f41322?only path=false&size=50&d=404Rafael Pinto(usuário não autenticado)
        5 de Junho de 2009, 14:03

         

        Olá, José.

        Obrigado pela resposta.

        Fiz um exemplo baseado no código que você mandou:

        function handler (evt)
           
            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!

Concurso ITU-T de Aplicações para IPTV 2012

13 de Agosto de 2012, 19:38, por Desconhecido

Gostaríamos de lembrar aos possíveis interessados que o prazo de registro para participação no Concurso ITU-T de Aplicações para IPTV 2012 (IPTV Application Challenge) se encerra nesta semana, dia 15 de agosto de 2012. Já o prazo para a submissão de aplicações se encerra no dia 07 de setembro de 2012.



NCL Eclipse 1.6 disponível

10 de Janeiro de 2012, 21:19, por Desconhecido

Caros membros da Comunidade Ginga,



Concursos de Aplicações Ginga-NCL

22 de Setembro de 2011, 3:22, por Desconhecido

    Gostaríamos de relembra-los de que há dois concursos de aplicações Ginga-NCL com inscrições ainda abertas. O convite é aberto a toda a comunidade de desenvolvedores de aplicações para o Middleware Ginga-NCL, em nível internacional. São os seguintes concursos:



Novas versões: Ginga e Ginga-NCL Virtual Set-top Box (v.0.12.3)

1 de Agosto de 2011, 20:58, por Desconhecido



Algumas Boas Notícias da Comunidade Ginga

28 de Julho de 2011, 21:31, por Desconhecido

Autor: Roberto Azevedo