Creating a timer using Lua

前端 未结 6 825
粉色の甜心
粉色の甜心 2020-12-31 13:50

I would like to create a timer using Lua, in a way that I could specify a callback function to be triggered after X seconds have passed.

What would be the best way t

相关标签:
6条回答
  • 2020-12-31 13:52

    Try lalarm, here: http://www.tecgraf.puc-rio.br/~lhf/ftp/lua/

    Example (based on src/test.lua):

    -- alarm([secs,[func]])
    alarm(1, function() print(2) end); print(1)
    

    Output:

    1
    2
    
    0 讨论(0)
  • 2020-12-31 13:57

    If milisecond accuracy is not needed, you could just go for a coroutine solution, which you resume periodically, like at the end of your main loop, Like this:

    require 'socket' -- for having a sleep function ( could also use os.execute(sleep 10))
    timer = function (time)
        local init = os.time()
        local diff=os.difftime(os.time(),init)
        while diff<time do
            coroutine.yield(diff)
            diff=os.difftime(os.time(),init)
        end
        print( 'Timer timed out at '..time..' seconds!')
    end
    co=coroutine.create(timer)
    coroutine.resume(co,30) -- timer starts here!
    while coroutine.status(co)~="dead" do
        print("time passed",select(2,coroutine.resume(co)))
        print('',coroutine.status(co))
        socket.sleep(5)
    end
    

    This uses the sleep function in LuaSocket, you could use any other of the alternatives suggested on the Lua-users Wiki

    0 讨论(0)
  • 2020-12-31 14:02

    use Script.SetTimer(interval, callbackFunction)

    0 讨论(0)
  • 2020-12-31 14:08

    After reading this thread and others I decided to go with Luv lib. Here is my solution:

    uv = require('luv') --luarocks install luv
    
    function set_timeout(timeout, callback)
      local timer = uv.new_timer()
      local function ontimeout()
        uv.timer_stop(timer)
        uv.close(timer)
        callback()
      end
      uv.timer_start(timer, timeout, 0, ontimeout)
      return timer
    end
    
    
    set_timeout(1000, function() print('ok') end) -- time in ms
    
    uv.run() --it will hold at this point until every timer have finished
    
    0 讨论(0)
  • 2020-12-31 14:09

    If it's acceptable for you, you can try LuaNode. The following code sets a timer:

    setInterval(function()
        console.log("I run once a minute")
    end, 60000)
    process:loop()
    
    0 讨论(0)
  • 2020-12-31 14:18

    On my Debian I've install lua-lgi packet to get access to the GObject based libraries.

    The following code show you an usage demonstrating that you can use few asynchronuous callbacks:

    local lgi = require 'lgi'
    local GLib = lgi.GLib
    
    -- Get the main loop object that handles all the events
    local main_loop = GLib.MainLoop()
    
    cnt = 0
    function tictac()
         cnt = cnt + 1
         print("tic")
         -- This callback will be called until the condition is true
         return cnt < 10
    end
    
    -- Call tictac function every 2 senconds
    GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, 2, tictac)
    
    -- You can also use an anonymous function like that
    GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, 1,
                             function()
                                print( "There have been ", cnt, "tic")
                                -- This callback will never stop
                                return true
                             end)
    
    -- Once everything is setup, you can start the main loop
    main_loop:run()
    
    -- Next instructions will be still interpreted
    print("Main loop is running")
    

    You can find more documentation about LGI here

    0 讨论(0)
提交回复
热议问题