web-dev-qa-db-ja.com

Luaを使用してタイマーを作成する

X秒が経過した後にトリガーされるコールバック関数を指定できるように、Luaを使用してタイマーを作成したいと思います。

これを達成するための最良の方法は何でしょうか? (1時間に1〜2回解析されるWebサーバーからデータをダウンロードする必要があります)

乾杯。

8
Goles

ここでlalarmを試してください: http://www.tecgraf.puc-rio.br/~lhf/ftp/lua/

例(src/test.luaに基づく):

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

出力:

1
2
5
John Zwinck

ミリ秒の精度が必要ない場合は、メインループの最後のように、定期的に再開するコルーチンソリューションを選択できます。次のようになります。

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

これはLuaSocketのスリープ機能を使用します。 Lua-users Wiki で提案されている他の代替手段を使用できます。

7
jpjacobs

許容できる場合は、 LuaNode を試すことができます。次のコードはタイマーを設定します。

setInterval(function()
    console.log("I run once a minute")
end, 60000)
process:loop()
1
Ignacio

このスレッドと他のスレッドを読んだ後、私は Luv libを使うことにしました。これが私の解決策です:

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
rodvlopes

script.SetTimer(interval、callbackFunction)を使用します

0
Chris