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
Se quiser tentar... informe-nos se deu certo. Boa sorte
<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..
<!-- 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)