Создание таймера с использованием Lua - PullRequest
8 голосов
/ 25 мая 2011

Я хотел бы создать таймер, используя Lua, таким образом, чтобы я мог указать функцию обратного вызова, которая будет запускаться через X секунд.

Каков наилучший способ достичь этого? (Мне нужно загрузить некоторые данные с веб-сервера, которые будут анализироваться один или два раза в час)

Приветствие.

Ответы [ 5 ]

7 голосов
/ 25 мая 2011

Если точность в миллисекундах не нужна, вы можете просто выбрать решение сопрограммы, которое вы периодически возобновляете, как в конце вашего основного цикла, например:

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

5 голосов
/ 25 мая 2011

Попробуйте 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
1 голос
/ 25 мая 2011

Если это приемлемо для вас, вы можете попробовать LuaNode .Следующий код устанавливает таймер:

setInterval(function()
    console.log("I run once a minute")
end, 60000)
process:loop()
0 голосов
/ 05 февраля 2019

Прочитав эту ветку и другие, я решил перейти с 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 голосов
/ 10 мая 2013

использовать Script.SetTimer (интервал, функция обратного вызова)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...