Delay em Lua

828 views
Skip to first unread message

Bernardo Meurer

unread,
Apr 5, 2014, 9:56:38 PM4/5/14
to lua...@googlegroups.com
Fala galera, eu to tentando fazer um delay em lua mas sem usar as soluções que botam o thread pra dormir. Eu tenho o seguinte loop:
   while (b<112) do
     b = b+1
   end
e eu estou tentando com que a cada vez que o loop rode ele demore cerca de 100 centésimos de segundo, usando esses métodos o programa fica todo travado. Eu tinha em mente algo como um timer mas to com dificuldades de implementar.

Daniel Ribeiro Filho

unread,
Apr 6, 2014, 7:51:27 AM4/6/14
to lua...@googlegroups.com
Qual a pergunta?
--
Lua BR - http://groups.google.com/group/lua-br
---
Você recebeu essa mensagem porque está inscrito no grupo quot;Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para lua-br+un...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Bernardo Meurer

unread,
Apr 6, 2014, 9:58:07 AM4/6/14
to lua...@googlegroups.com
Foi mal, como eu faço um delay dentro do loop que não seja congelando o thread e sim uma espécie de timer?

Daniel Ribeiro Filho

unread,
Apr 6, 2014, 2:50:47 PM4/6/14
to lua...@googlegroups.com
Voce pode fazer chamando uma função do sistema operacional.
http://lua-users.org/wiki/SleepFunction

Daniel Ribeiro
sent by phone

Bernardo Meurer

unread,
Apr 6, 2014, 3:38:08 PM4/6/14
to lua...@googlegroups.com
Eu tentei usar essas, mas elas travam o programa enquanto esperam, eu estou tentando fazer algo como a função delay do arduino.

Gabriel Duarte

unread,
Apr 6, 2014, 8:34:50 PM4/6/14
to lua...@googlegroups.com

Então pra que vc quer uma função de delay? Explica bem o problema... O que vc precisa fazer enquanto esse delay acontece?

Rodrigo Sanguanini

unread,
Apr 7, 2014, 7:38:38 AM4/7/14
to lua...@googlegroups.com
Daniel, acho que você não leu o primeiro e-mail muito bem.
Está explícito que o Bernardo precisa de um timer (algo que não seja a função Sleep, pois a mesma está bugando) que possa parar por 100 centésimos de segundo a rotina.
Ele também comentou que o método SleepFunction não funcionou.

Creio eu que encontrando uma função speed (timeout, ou o que seja) para o sistema operacional, a seguinte função rode sem problemas:

function sleep(n)
  os.execute("sleep " .. tonumber(n))
end
Até porque pra mim rodou no Windows, sem problema algum: eu possuo Cygwin.

Att,
Att, Rodrigo Sanguanini

BRUNO ROCHA

unread,
Apr 7, 2014, 10:40:05 AM4/7/14
to lua...@googlegroups.com
Vc terá que criar outra thread, uma fará a execução de um processo e outra
estará dormindo ou executando outro processo, acho que é isto que vc quer,
não ?


Date: Sun, 6 Apr 2014 21:34:50 -0300
Subject: Re: [lua-br] Delay em Lua
From: confu...@gmail.com
To: lua...@googlegroups.com

Eric Chiesse

unread,
Apr 8, 2014, 11:52:10 AM4/8/14
to lua...@googlegroups.com
Delay também trava o programa. Tá na documentação passada.

Quanto a threads, é bom lembrar que lua não é multithread (coroutine não é thread !)

Também não entendi o efeito esperado.

---
Eric

Buryoku Fujita

unread,
Apr 8, 2014, 3:28:31 PM4/8/14
to lua...@googlegroups.com
Estou precisando de desenvolvedor de app para IOS, Android e WinPhone.

Trabalho freelancer, interessados favor entrar em contato por email.

Bernard Noblat
+55 21 99558-2927

Enviado via 📱iPhone

Bernardo Meurer

unread,
Apr 9, 2014, 10:24:57 AM4/9/14
to lua...@googlegroups.com
É o seguinte, o objetivo desse loop é fazer que a cor de um polígono mude de maneira lenta, uma transição ao envés de só uma mudança súbita. A minha solução foi com o loop, tem outra maneira? Como eu posso botar esse sleep em uma coroutine se seguir esse caminho?

Edinei L. Cipriani

unread,
Apr 9, 2014, 11:39:26 AM4/9/14
to lua...@googlegroups.com

Att,
Edinei L. Cipriani
Criador do BS Sites - Um plataforma de criação de sites dinâmicos e responsivos sem a necessidade de saber programar.
http://bssites.com.br


Em 9 de abril de 2014 11:24, Bernardo Meurer <pbc...@gmail.com> escreveu:
É o seguinte, o objetivo desse loop é fazer que a cor de um polígono mude de maneira lenta, uma transição ao envés de só uma mudança súbita. A minha solução foi com o loop, tem outra maneira? Como eu posso botar esse sleep em uma coroutine se seguir esse caminho?
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para lua-br+un...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/d/optout.

Edinei L. Cipriani

unread,
Apr 9, 2014, 11:39:38 AM4/9/14
to lua...@googlegroups.com

Att,
Edinei L. Cipriani
Criador do BS Sites - Um plataforma de criação de sites dinâmicos e responsivos sem a necessidade de saber programar.
http://bssites.com.br


Andrws Vieira

unread,
Apr 9, 2014, 1:57:13 PM4/9/14
to lua...@googlegroups.com
Bernardo,

Como atualiza a cor ?
Não é possível vc fazer (muito) mais atualizações de tonalidades quase  iguais ? Isso já não daria o efeito que tu deseja ?

Abraços.


Em 9 de abril de 2014 12:39, Edinei L. Cipriani <phpe...@gmail.com> escreveu:

Att,
Edinei L. Cipriani
Criador do BS Sites - Um plataforma de criação de sites dinâmicos e responsivos sem a necessidade de saber programar.
http://bssites.com.br


Em 9 de abril de 2014 12:39, Edinei L. Cipriani <phpe...@gmail.com> escreveu:


Att,
Edinei L. Cipriani
Criador do BS Sites - Um plataforma de criação de sites dinâmicos e responsivos sem a necessidade de saber programar.
http://bssites.com.br


Em 9 de abril de 2014 11:24, Bernardo Meurer <pbc...@gmail.com> escreveu:

É o seguinte, o objetivo desse loop é fazer que a cor de um polígono mude de maneira lenta, uma transição ao envés de só uma mudança súbita. A minha solução foi com o loop, tem outra maneira? Como eu posso botar esse sleep em uma coroutine se seguir esse caminho?
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para lua-br+un...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/d/optout.


Você recebeu essa mensagem porque está inscrito no grupo quot;Lua BR" dos Grupos do Google.

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para lua-br+un...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Andrws Aires Vieira         
Mestrando em Computação
Universidade Federal do Rio Grande do Sul - UFRGS

Bernardo Meurer

unread,
Apr 9, 2014, 5:42:23 PM4/9/14
to lua...@googlegroups.com
Eu estou usando o Lua com o Love2d. Na função draw do lua a cor tem variáveis R,G,B que na função update eu mudo, que muda a cor. Esse método não funciona pois a cor muda rápido demais

Bernardo Meurer

unread,
Apr 9, 2014, 5:45:29 PM4/9/14
to lua...@googlegroups.com
Estou experimentando, mas não consigo implementar, exemplo:
   while (r < 25) do
     local c3 = cron.every(0.1,(r = r+1))
   end 
eu recebo o seguinte erro:
Casa\main.lua:51: ')' expected near '='
e eu estou incluindo a bliblioteca direitinho no começo com 
 cron = require 'cron'
.
O que estou fazendo errado?

Daniel Ribeiro Filho

unread,
Apr 9, 2014, 9:35:10 PM4/9/14
to lua...@googlegroups.com
Incrementa o contador r fora da chamada de função.

while (r < 25) do
     local c3 = cron.every(0.1,r)
        r=r+1
   end 


Daniel Ribeiro
sent by phone
Você recebeu essa mensagem porque está inscrito no grupo quot;Lua BR" dos Grupos do Google.

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para lua-br+un...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Sandro Magno

unread,
Apr 10, 2014, 1:03:58 AM4/10/14
to lua...@googlegroups.com
Considerando que:
"variável_condição" é como você decidir ativar a mudança de cor;
"variável_contar" é 0;
"variável_intervalo" é o tempo que você quer entre cada mudança de cor;
OBS.: na mesma unidade do método "agora"
"agora" é o método que você escolher tomar o tempo do sistema;
"variável_cor" é a cor que você deseja alterar.

Talvez lhe sirva algo sem loop, tipo:

SE variável_condição
SE variável_contar = 0 {
variável_futuro = agora + variável_intervalo
variável_contar = 1
}
SE agora >= variável_futuro {
variável_cor = nova_cor
variável_contar = 0
}
}

Lembrando que, a precisão pode ter uma perda que deve ser considerada de acordo com o total de código a executar.


Você recebeu essa mensagem porque está inscrito no grupo quot;Lua BR" dos Grupos do Google.

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para lua-br+un...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Sandro M P Santos
55(71)8845-3819

Eric Chiesse

unread,
Apr 10, 2014, 12:09:14 PM4/10/14
to lua...@googlegroups.com
aahhhhh !!! Agora dá pra te ajudar direito.

Vc tem que fazer a transição de cor acontecer dentro do love.update. A cada vez que ela é chamada você atualiza a cor de pintura e não precisa por no while.

Para controlar a velocidade de transição use a variável dt fazendo uma continha para interpolar.
Mais ou menos assim:
function love.load()
    transitionDuration = 1 -- 1seg
end

function love.update(dt)
    if shallColorChange(dt, transitionDuration) then
        love.graphics.setColor(r, g, b, a)
    end
end

Onde a função "shallColorChange" verifica se a cor deve mudar com base no tempo e assim define a velocidade da transição.

Isso vai funcionar se vc tiver um único objeto (apenas como prova de conceito).
Se você tiver mais objetos cada um com sua cor (situação real), use love.update apenas para calcular e salvar a cor numa variável e chame love.graphics.setColor dentro de love.draw antes de pintar o seu objeto.

Tenta evoluir com isso. Vou ver se mais tarde consigo montar um exemplo funcional com as coisas em seus devidos lugares.

Boa sorte!

---
Eric


Em 9 de abril de 2014 18:45, Bernardo Meurer <pbc...@gmail.com> escreveu:
Você recebeu essa mensagem porque está inscrito no grupo quot;Lua BR" dos Grupos do Google.

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para lua-br+un...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Eric Chiesse

unread,
Apr 10, 2014, 12:18:44 PM4/10/14
to lua...@googlegroups.com
E só para deixar claro: Você não precisa de sleep, nem de threads, nem de cron. Sleep no meio do teu jogo vai exatamente travar teu jogo. Basta calcular o momento certo de mudar a cor dentro de love.update.

Lembre que love.update é uma callback chamada pela engine a cada loop do jogo. Por isso vc não precisa usar while. Dê uma olhada em love.run (google) para entender como essa callback é chamada.

---
Eric

Bernardo Meurer

unread,
Apr 10, 2014, 7:47:11 PM4/10/14
to lua...@googlegroups.com
Eu acho que estou entendendo o que você está dizendo, mas continua com dificuldade de implementar. Têm como você postar um exemplo, ia ajudar muito. valeu.

Eric Chiesse

unread,
Apr 10, 2014, 10:30:31 PM4/10/14
to lua...@googlegroups.com
Escrevi essa prova de conceito: http://paste.ubuntu.com/7233214/

O lance agora é atribuir transições a objetos de maneira independente. Isso pode ser conseguido criando objetos que representem transições e atribuindo eles aos objetos.

De qq maneira esse exemplo é um bom ponto de partida. Para ver a transição clique com o mouse na tela.

---
Eric

Leandro Paes

unread,
Dec 19, 2018, 2:14:44 PM12/19/18
to Lua BR
Oi, Eric.

Você poderia me ajudar? Você teria a referência/link onde evidencia que o delay causa crash no programa?

Estou tendo dificuldades por aqui.

Abraço

Eric Chiesse

unread,
Dec 19, 2018, 4:26:34 PM12/19/18
to lua...@googlegroups.com
Dá uma lida na referência oficial de lua (https://www.lua.org/manual/5.3/). O ponto é simples: Lua é single thread, então de vc der um sleep (estamos usando delay como sinonimo de sleep aqui) nele ele vai travar (não dar crash, mas vai parar a execução de todo o programa no ponto desse sleep).

Tem como fazer um esquema de sleep mais esperto com corrotinas mas dá um certo trabalho.

E além do mais não é o ponto que eu explico nessa thread. Se vc está trabalhando com love2d e quer fazer uma transição (assunto dos emails aqui) faz como eu expliquei usando o loop de eventos do love.

Se teu problema for diferente, cria uma thread (de emails) nova explicando seu problema com detalhes.


---
Eric


Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para lua-br+un...@googlegroups.com.

Leandro Paes

unread,
Dec 19, 2018, 5:41:04 PM12/19/18
to Lua BR
Oi, Eric.

Obrigado pelo feedback!

Só queria uma alternativa para o uso do delay. No cenário abaixo o programa trava, basicamente para o uso de um contador.

Ex:
for i = 0, 50, 1 do
   --dosomething
   delay(1)
end

Denis Dos Santos Silva

unread,
Dec 19, 2018, 6:39:53 PM12/19/18
to Lua BR
só pra complementar o que a galera já falou

há (pelo menos) dois tipos de *delay* "blocante" e "não blocante"

se vc usar o os.time() terá um "timer" com precisão de 1s (o que é muito)

poderá implementar de forma simples usando os.time() ou os.gettime() (luasocket ou equivalente com precisão do gettimeofday() https://linux.die.net/man/2/gettimeofday)



como o os.time() retorna unix timestamp seria somente comparar o tempo

x1, x2 = os.time(), os.time()+10

repeat
...
until x2 < x1

se for pra "agendar" funções ou mesmo "timer" global ... dai há projetos/bibliotecas/módulos próprios pra isso


----
$ cat time.lua
x1, x2 = os.time(), os.time() + 10;

print( _VERSION )
print( os.date('%c', x1) )
print( os.date('%c', x2) )

----
$lua-5.1 time.lua
Lua 5.1
Wed Dec 19 22:32:33 2018
Wed Dec 19 22:32:43 2018

---
Reply all
Reply to author
Forward
0 new messages