Timer 使用Lua创建计时器

Timer 使用Lua创建计时器,timer,lua,Timer,Lua,我想使用Lua创建一个计时器,这样我可以指定一个回调函数,在X秒过去后触发 实现这一目标的最佳方式是什么?(我需要从Web服务器下载一些数据,这些数据每小时会被解析一到两次) 干杯。试试拉拉姆,这里: 示例(基于src/test.lua): 输出: 1 2 如果你能接受,你可以试试。以下代码设置计时器: setInterval(function() console.log("I run once a minute") end, 60000) process:loop() 如果不需要

我想使用Lua创建一个计时器,这样我可以指定一个回调函数,在X秒过去后触发

实现这一目标的最佳方式是什么?(我需要从Web服务器下载一些数据,这些数据每小时会被解析一到两次)


干杯。

试试拉拉姆,这里:

示例(基于src/test.lua):

输出:

1
2

如果你能接受,你可以试试。以下代码设置计时器:

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

如果不需要毫秒精度,您可以选择一个协程解决方案,定期恢复,如在主循环结束时,如下所示:

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
require'socket'——用于具有睡眠功能(也可以使用os.execute(睡眠10))
定时器=功能(时间)
本地初始化=os.time()
本地差异=os.difftime(os.time(),init)

虽然diff使用Script.SetTimer(interval,callbackFunction)

在阅读了这个线程和其他线程之后,我决定使用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
在我的Debian上,我安装了数据包以访问基于数据库的库

下面的代码向您展示了一种用法,说明您可以使用少量异步回调:

local lgi=需要“lgi”
本地GLib=lgi.GLib
--获取处理所有事件的主循环对象
本地主循环=GLib.MainLoop()
cnt=0
函数tictac()
cnt=cnt+1
打印(“tic”)
--将调用此回调,直到条件为true为止
返回cnt<10
结束
--每2秒调用一次tictac函数
GLib.timeout\u add\u seconds(GLib.PRIORITY\u默认值,2,tictac)
--您也可以使用这样的匿名函数
GLib.timeout\u add\u seconds(GLib.PRIORITY\u默认值为1,
函数()
打印(“有”,cnt,“tic”)
--这个回调永远不会停止
返回真值
(完)
--一旦一切都设置好,就可以启动主循环
主循环:运行()
--接下来的指令仍将被解释
打印(“主循环正在运行”)

你可以找到

你能给我举个例子,告诉我如何用一种简单的方式使用alarm来每分钟调用一个函数吗?你看过代码了吗?lalarm归档文件中有一个文件“test.lua”。不可能将两个警报设置为一行,否则第二个警报将覆盖第一个警报。
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