Ir para o conteúdo

 Voltar a Linguagem Lua
Tela cheia

Time out em uma aplicação Lua e Coroutine

15 de Janeiro de 2009, 10:26 , por Desconhecido - | Ninguém seguindo este artigo por enquanto.
Visualizado 111 vezes

Pessoal,

Primeiro vou explicar o que estou implementando e depois expor minha dúvida, se alguém puder me esclarecer, desde já agradeço.

Bem, eu estou implementando um time out na minha aplicação. Primeiro eu pensei em implementar da maneira como acontece na internet, então eu fiz da seguinte forma: eu registro o tempo do último comando que o usuário executou, e no comando seguinte, eu verifico quanto tempo decorreu do comando anterior.

Ex: Usuario estava executando a aplicação e deixou ela parada por cinco minutos, aí ele voltou.. Quando o usuário tentar executar um novo comando, a aplicação é encerrada (pois excedeu o tempo).

Dessa forma seria semelhante ao browser, que só dá time out quando eu mando uma nova requisição para o servidor. Mas pensando no ambiente da tv, não seria algo legal, uma vez que um único aparelho é usado por várias pessoas. O ideal seria que a aplicação por si, decorrido certo tempo após o último comando, se encerrasse e a tv voltasse à sua programação normal. Concordam comigo?

Entao pensando numa maneira de fazer isso, pensei em uma thread. E colocaria uma thread para rodar e quando ela contasse determinado tempo, ela encerraria a aplicação. Sendo que a cada novo comando do usuário esse tempo seria reiniciado.

Minha dúvida é se seria possível fazer isso usando coroutine ou alguma outra forma. Pelo que consegui absorver até agora lendo sobre coroutine, observei que ela pode ser suspensa e retomada de onde parrou, mas não é um processo paralelo. Estou correto?



Autor: Luis Antonio Tavares


1717 comentários

  • B84c5aed621335947af2d6faa786d885?only path=false&size=50&d=404Francisco Sant'Anna(usuário não autenticado)
    15 de Janeiro de 2009, 12:08

     

    Talvez não tenha entendido o problema direito, mas a função "event.timer(f)" não resolveria?

  • B6b3cae0711e1cd6e59c07cc4b342f8b?only path=false&size=50&d=404José Ricardo Júnior(usuário não autenticado)
    15 de Janeiro de 2009, 12:49

     

    Não sei se essa seria a melhor solução mas pensei em algo que pode funcionar:

    Ao invés de deixar o Lua contar o tempo, deixe o NCL fazer isso. Após cada comando do usuário no Lua, o mesmo envia um evento para o NCL informando que o usuário fez alguma coisa. Suponha que sua mídia Lua tenha um area="ocioso". Quando o NCL receber o evento de que ocioso começou (script Lua que vai iniciá-lo) o NCL inicia uma outra mídia que possui delay de 5min, por exemplo. Quando essa mídia iniciar (após os 5min) o NCL termina a mídia Lua. No entanto, se o usuário voltar a usar o script antes dos 5min o Lua deve parar "ocioso". O NCL, ao receber esse evento, deverá abortar a inicialização da mídia com o delay de 5min.

    É bem simples e acho que deve funcionar (nunca tentei fazer algo do tipo).
    Se quiser tentar... informe-nos se deu certo.

    Boa sorte

    • 5d44771aca8671527c308ac9c1352dd2?only path=false&size=50&d=404Luis Antonio Tavares(usuário não autenticado)
      15 de Janeiro de 2009, 13:52

       

      Olá José,

      Cheguei a pensar algo do tipo, mas nao sabia se seria possível, mas vendo que você pensou nisso acredito que seja realmente a melhor maneira. Vou tentar fazer, se conseguir eu posto aqui.

      Valeu!

      • 5d44771aca8671527c308ac9c1352dd2?only path=false&size=50&d=404Luis Antonio Tavares(usuário não autenticado)
        16 de Janeiro de 2009, 11:51

         

        Pessoal,

        seria possível eu resetar o tempo de um explicitDur pelo lua, sem precisar dar um stop ou abort?

        • 5d44771aca8671527c308ac9c1352dd2?only path=false&size=50&d=404Luis Antonio Tavares(usuário não autenticado)
          16 de Janeiro de 2009, 11:52

           

          * explicitDur do descriptor de uma mídia NCL

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

             

            Até onde sei o Lua só pode alterar os valores de "property" e "area" da mídia NCL referente ao próprio Lua.

            No entanto, na especificação há um módulo (que ainda não foi criado / disponibilizado) chamado NCLEdit, que permite alterar, em tempo real, o documento NCL. Nesse caso, acredito que será possível modificar o que quiser. Mas, por enquanto, isso ainda não é possível.

             Desconheço outra maneira de modificar tal valor...

             

            Agora uma pergunta. Você está usando explicitDur para que exatamente nessa aplicação que vc sugeriu?

            • 5d44771aca8671527c308ac9c1352dd2?only path=false&size=50&d=404Luis Antonio Tavares(usuário não autenticado)
              19 de Janeiro de 2009, 10:42

               

              Eu estava pensando que no momento em que carregasse minha aplicação Lua eu disparasse no NCL uma midía com um explictDur definido e quando esse explicitDur esgotasse o tempo ele encerrasse a aplicação Lua.

              Mas como esse tempo não pode ser reniciado sem dar um stop ou abort, não tenho como fazer dessa forma.

              Você sugere alguma forma?

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

                 

                Por que não usar stop e abort? Toda vez que você iniciar a execução dessa mídia, sua duração continuará sendo a definida em explicitDur, começando novamente do zero.

                E ao invés de usar explicitDur, porque não usar um delay? Com explicitDur vc obrigatoriamente terá uma mídia sendo executada (mesmo que não esteja visível), mas com um delay na inicialização da mídia não. Vc poderia abortar a inicialização dessa mídia antes do delay acabar, quando o Lua emitir o sinal para tal. Assim, nenhuma mídia desnecessária seria processada.

                Contudo, explicitDur tb deve funcionar. Nesse caso, vc precisará parar essa mídia toda vez q houver um comando no Lua e iniciá-la qd o Lua ficar ocioso.

                 Uma coisa que me veio em mente com esse tópico é que esse sistema de fechar uma aplicação ociosa automaticamente deveria ser algo implementado nos set-top boxes, pois serveriam para qualquer aplicação (ou todas as aplicações deveriam implementar isso, o que não acho uma boa solução).

                • 5d44771aca8671527c308ac9c1352dd2?only path=false&size=50&d=404Luis Antonio Tavares(usuário não autenticado)
                  19 de Janeiro de 2009, 13:55

                   

                  Então, o problema quando uso o explicitDur é o seguinte: eu utilizo a role onEnd da mídia com o explicitDur para encerrar a aplicação Lua. Aí que está meu problema, pois quando eu dou o abort para dar o start novamente e reiniciar o tempo, a mídia já atinge a condição onEnd e encerra a aplicação. Moral da história: não consigo reestartar minha mídia com explitDur sem passar pela condição onEnd.

                  A maneira que você descreveu é parecida, ainda não testei, mas estou achando que ela vai entrar no mesmo problema que eu descrevi acima. Não sei se fui claro na minha explicação.

                  Quanto ao sistema que vc falou para Time Out implementado pelos próprios stbs, acho que seria interessante, mas creio que diferentes aplicações precisem de Time Out diferentes. Ex: aplicação para leitura de notícias e uma aplicação bancária. Em uma notícia o usuário pode ficar muito mais tempo sem mecher no controle. Mas é só uma opinião.

                  • B6b3cae0711e1cd6e59c07cc4b342f8b?only path=false&size=50&d=404José Ricardo Júnior(usuário não autenticado)
                    20 de Janeiro de 2009, 9:54

                     

                    Tive uma idéia que deve funcionar. Nessa mídia com explicitDur, crie uma "area" com início e fim iguais a 5min e, ao invés de esperar a mídia acabar para terminar a aplicação Lua, espere esse evento acontecer (no caso, role="onBeginStop" component="suaMidiaComExplicitDur" interface="fimDeTempo", onde "fimDeTempo" é o id da area que mencionei acima).

                    Assim, somente quando chegar os 5min de execução da mídia seu script Lua será terminada e não haverá mais problema quanto a parar e reiniciar a mídia do explicitDur.

                    Outra coisa... olhando a norma eu vi algo interessante. Ao abortar uma mídia você pára todas as execuções dela. Ao parar (stop), no entanto, ela pode ser reiniciada automaticamente caso o atributo repetitions esteja devidamente configurado para tal. O valor de repetitions diz quantas vezes a mídia deve ser repetida. Pode ser valor "indefinite", que irá fazer com que a mídia se repita indefinidamente até alguma ação externa interrompê-la (acredito que um Abort, no caso).

                    Sugiro então que tente (se quiser) usar esse atributo (você precisará criar um novo conector), pois com isso você nem precisará usar onEndStart para reiniciar a mídia, ela reicinará indefinidamente até ser abortada (que ocorrerá quando o tempo esgotar).

                    Boa sorte 

                    • B6b3cae0711e1cd6e59c07cc4b342f8b?only path=false&size=50&d=404José Ricardo Júnior(usuário não autenticado)
                      20 de Janeiro de 2009, 9:55

                       

                      corrigindo acima o bind seria:

                      role="onBegin" component="suaMidiaComExplicitDur" interface="fimDeTempo"

                      e não "onBeginStop"

                      • 5d44771aca8671527c308ac9c1352dd2?only path=false&size=50&d=404Luis Antonio Tavares(usuário não autenticado)
                        20 de Janeiro de 2009, 16:34

                         

                        Boa José,

                        Por enquanto não tenho tempo para testar, mas acho que do jeito que você descreveu vai funcionar.

                        • 5d44771aca8671527c308ac9c1352dd2?only path=false&size=50&d=404Luis Antonio Tavares(usuário não autenticado)
                          9 de Fevereiro de 2009, 11:31

                           

                          Olá José,

                          Testei da maneira como vc descreveu e não deu certo (testei no NCL player)... A âncora entende como se a midia ainda estivesse em execução mesmo após o stop. Ou seja, mesmo dando o stop âncora é executada.

                           Fiz da seguinte maneira:

                           NCL:

                          <!-- media com lua com duas interfaces: uma para terminar e outra para iniciar novamente o time out -->
                              <media id="lua" src="teste.lua" descriptor="dsLua">
                                  <area id="beginTimeOut"/>
                                  <area id="endTimeOut"/>           
                              </media>
                                 
                              <!-- Midia oculta para possibilitar TIME OUT -->   
                              <media id="timeComponent" src="media/imagens/teste.png" descriptor="dTime">
                                  <area id="timeAnc" begin="5s" end="10s"/>
                              </media>

                           <!-- Links -->    

                              <!-- Inicia componente de time out -->
                              <link xconnector="connectors#onBeginStart">
                                  <bind role="onBegin" component="lua" interface="beginTimeOut"/>        
                                  <bind component="timeComponent" role="start"/>
                              </link>
                                

                            <!-- Termina componente de time out -->
                              <link xconnector="connectors#onBeginStop">
                                  <bind role="onBegin" component="lua" interface="endTimeOut"/>        
                                  <bind component="timeComponent" role="stop"/>
                              </link>

                            <!-- Ao iniciar a âncora do componente de timeout retorna a tela inicial e encerra o lua -->
                              <link xconnector="connectors#onBeginSetNStopNStartN">
                                  <bind role="onBegin" component="timeComponent" interface="timeAnc"/>
                                  <bind component="video" interface="bounds" role="set">
                                      <bindParam name="bounds" value="0%,0%,100%,100%"/>
                                  </bind>        
                                  <bind component="timeComponent" role="stop"/>

                                  <bind component="lua" role="stop"/>
                                  <bind component="botaoInteracao" role="start"/>            
                              </link>

                           Lua:

                          -- esse código é executado toda vez que uma tecla é pressionada

                           event.post('out',
                              {
                                  class        = 'ncl',
                                  type        = 'presentation',
                                  area        = 'endTimeOut',
                                  transition    = 'starts'
                              })    
                              
                              event.post('out',
                              {
                                  class        = 'ncl',
                                  type        = 'presentation',
                                  area        = 'beginTimeOut',
                                  transition    = 'starts'
                              })

                          Creio que fiz da maneira como vc descreveu..

                          • 2133593267bb9e231f3ef646fd94a27d?only path=false&size=50&d=404Romualdo Monteiro R. Costa(usuário não autenticado)
                            10 de Fevereiro de 2009, 22:48

                             

                            Olá a todos,

                            Gostaria de propor uma solução:

                            É possível que uma mídia fique indefinidamente sendo executada.  É só usar o atributo repeat no simpleaction do conector  que dispara a apresentação da mídia com valor indefinite.

                            Essa mídia será a responsável por controlar o timeout, isso pode ser feito da seguinte forma: toda a vez que o evento de apresentação inicializa, esse evento seta uma variável com um valor qualquer que signifique verdadeiro.

                            Qdo o tempo de exibição dessa mídia terminar, a aplicação lua será encerrada, se a variável acima tiver valor verdadeiro.

                            A aplicação lua tem que setar o valor dessa variável para falso sempre que a aplicação lua for utilizada.

                            Acho que isso vai funcionar, hoje não tive tempo de testar, se tiver tempo posto o exemplo.

                            []

                            Romualdo.

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

                             

                            Olá Luis, 

                            fui testar o que você falou e não entendi direito qual foi seu problema. Contudo, eu consegui fazer o que você quer, segue os códigos:

                             

                            <?xml version="1.0" encoding="ISO-8859-1"?>
                            <!-- Generated by NCL Eclipse -->
                            <ncl id="meuNCL" xmlns="http://www.ncl.org.br/NCL3.0/EDTVProfile">
                                <head>
                                    <regionBase>
                                        <region id="regiaoPrincipal" width="100%" height="100%">
                                            <region id="regiaoLua" width="100%" height="100%"/>
                                            <region id="regiaoImagem" width="10%" height="10%" top="5%" left="85%"/>
                                            <region id="regiaoTimeOut" width="10%" height="10%"/>
                                        </region>
                                    </regionBase>

                                    <descriptorBase>
                                        <descriptor id="descLua" region="regiaoLua" focusIndex="controle"/>
                                        <descriptor id="descImagem" region="regiaoImagem"/>
                                        <descriptor id="descTimeOut"/>
                                    </descriptorBase>       

                                    <connectorBase>           
                                        <causalConnector id="onBeginStartN">
                                            <simpleCondition role="onBegin"/>
                                            <simpleAction role="start" max="unbounded" qualifier="par"/>
                                        </causalConnector>

                                        <causalConnector id="onEndStopN">
                                            <simpleCondition role="onEnd"/>
                                            <simpleAction role="stop" max="unbounded" qualifier="par"/>
                                        </causalConnector>

                                        <causalConnector id="onBeginSetN">
                                            <connectorParam name="var"/>               
                                            <simpleCondition role="onBegin"/>
                                            <simpleAction role="set" max="unbounded" qualifier="par" value="$var"/>               
                                        </causalConnector>
                                    </connectorBase>
                                </head>
                                <body>
                                    <!-- Inicia a aplicação com o script Lua -->
                                    <port id="inicio" component="script"/>
                                   
                                    <!-- Propriedades do Ginga para passar controle do teclado para o Lua -->
                                    <media type="application/x-ginga-settings" id="programa">
                                        <property name="currentKeyMaster" value="controle"/>
                                    </media>

                                    <!-- Script Lua -->
                                    <media id="script" descriptor="descLua" src="script.lua">
                                        <area id="ocioso"/>
                                    </media>

                                    <!-- Imagem que será exibida sempre, evitando finalizar a aplicação -->
                                    <media id="imagem" descriptor="descImagem" src="imagem.png"/>

                                    <!-- Mídia de timeOut não precisa exibir nada na tela. Quando area 'fim' ocorrer, terminará o Lua -->
                                    <media id="timeOut" descriptor="descTimeOut">
                                            <area id="fim" begin="15s" end="15s"/> 
                                    </media>

                                    <!-- Passa controle do teclado para o Lua -->
                                    <link xconnector="onBeginSetN">
                                        <bind component="script" role="onBegin"/>
                                        <bind component="programa" interface="currentKeyMaster" role="set">
                                            <bindParam name="var" value="controle"/>
                                        </bind>
                                    </link>

                                    <!-- Inicia a imagem junto com o script Lua -->
                                    <link xconnector="onBeginStartN">
                                        <bind component="script" role="onBegin"/>
                                        <bind component="imagem" role="start"/>
                                    </link>

                                    <!-- Quando a ociosidade do Lua for ativada, inicia o timeOut -->
                                    <link xconnector="onBeginStartN">
                                        <bind component="script" interface="ocioso" role="onBegin"/>
                                        <bind component="timeOut" role="start"/>
                                    </link>

                                    <!-- Quando a ociosidade do Lua for desativada, finaliza o timeOut -->
                                    <link xconnector="onEndStopN">
                                        <bind component="script" interface="ocioso" role="onEnd"/>
                                        <bind component="timeOut" role="stop"/>
                                    </link>
                                   
                                    <!-- Se timeOut chegar aos 15s, termina o script Lua -->
                                    <link xconnector="onEndStopN">
                                        <bind component="timeOut" interface="fim" role="onEnd"/>
                                        <bind component="script" role="stop"/>
                                    </link>

                                    <!-- Quando script Lua terminar, não precisa mais do timeOut, então finaliza-o também -->
                                    <link xconnector="onEndStopN">
                                        <bind component="script" role="onEnd"/>
                                        <bind component="timeOut" role="stop"/>
                                    </link>

                                </body>
                            </ncl>

                             

                             

                            LUA:

                             

                            -- Apenas para visualizar quando a mídia Lua acabar
                            canvas:attrColor('white')
                            canvas:drawRect('fill',10,10,200,200)
                            canvas:flush()

                            -- Re-ativa ociosidade
                            function ativaOciosidade()
                                event.post('out', {    class        = 'ncl',
                                            type        = 'presentation',
                                            area        = 'ocioso',
                                            transition    = 'starts' } )
                            end

                            -- Inicia a aplicação ativando a ociosidade
                            ativaOciosidade()

                            -- Função tratadora de eventos
                            function aplicacao(evt)
                                -- Quando uma tecla for pressionada
                                if evt.class == 'key' and evt.type == 'release' then
                                    -- Apenas para visualizar que ocorreu algo
                                    print(evt.key)
                                    -- Avisa ao NCL que a ociosidade acabou
                                    event.post('out', {    class        = 'ncl',
                                                      type        = 'presentation',
                                                area        = 'ocioso',
                                                transition    = 'stops' } )
                                    -- Aguarda 200 ms e re-ativa ociosidade (tempo é necessário para evitar ativar e desativar muito rapidamente, o que dá problema)
                                    event.timer(200,ativaOciosidade)
                                   
                                end
                            end

                            -- Registra função
                            event.register(aplicacao)

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