- luat已经将定时器封装入sys模块
- 每创建一个任务就会消耗一个定时器,最大不能超过32个
一. luat定时器使用方法
1. sys.timerStart(fnc, ms, ...) //开启一个定时器
参数
参数 | 释义 |
---|---|
fnc | fnc 定时器回调函数 |
ms | ms 整数,最大定时126322567毫秒 |
param | ... 可变参数 fnc的参数 |
返回值
number 定时器ID,如果失败,返回nil
2. sys.timerStop(val, ...) //关闭定时器
参数
参数 | 释义 |
---|---|
val | 值为number时,识别为定时器ID,值为回调函数时,需要传参数 |
param | ... val值为函数时,函数的可变参数 |
3. sys.timerStopAll(fnc) //关闭同一回调函数的所有定时器
参数 | 释义 |
---|---|
fnc | fnc 定时器回调函数 |
4. sys.timerLoopStart(fnc, ms, ...) //开启一个循环定时器
参数
参数 | 释义 |
---|---|
fnc | fnc 定时器回调函数 |
ms | ms 整数,最大定时126322567毫秒 |
param | ... 可变参数 fnc的参数 |
5. sys.timerIsActive(val, ...) //判断某个定时器是否处于开启状态
参数
参数 | 释义 |
---|---|
val | val 有两种形式 一种是开启定时器时返回的定时器id, 另一种是传入开启定时器时的回调函数,此形式时必须再传入可变参数...才能唯一标记一个定时器 |
param | ... 可变参数 fnc的参数 |
返回值
number 开启状态返回true,否则nil
二. 定时器的典型用法
module(..., package.seeall)
-- 开启定时器
sys.timerStart(function(t) print("time now:", t) end, 8000, os.time())
-- 开启定时器,并使用id关闭
local tid2 = sys.timerStart(function(t) print("2222time now:", t) end, 8000,
os.time())
sys.timerStop(tid2)
-- 开启定时器,并使用函数关闭
local timer_func = function(t) print("333time now:", t) end
sys.timerStart(timer_func, 8000, os.time())
sys.timerStop(timer_func, os.time())
-- 开启定时器,并使用timerStopAll函数关闭
local timer_func2 = function(t) print("454545time now:", t) end
sys.timerStart(timer_func2, 8000, os.time())
sys.timerStart(timer_func2, 8000, os.time())
sys.timerStopAll(timer_func2)
-- 开启循环定时器
sys.timerLoopStart(function(os_time_func) print("time now:", os_time_func()) end, 1000, os.time)
三. 巧用函数传递及收集参数
如果你理解了lua的特性, 其实也算不上巧妙, 但你看之前的程序时想到了吗?
sys.timerStart(log.info, 1000, "当前时间是:", os.time())
四. 定时器覆盖
定时器会被同回调函数(参数也必须相同)的定时器重置, 重置后重新计时
如下例: 因为定时器总是被重置, 永远不会执行
module(..., package.seeall)
sys.timerStart(sys.restart, 10000, "系统重启中")
sys.taskInit(function()
while true do
sys.timerStart(sys.restart, 10000, "系统重启中")
sys.wait(1000)
end
end)
但下面的例子会被执行, 因为参数不用就不会覆盖
module(..., package.seeall)
sys.timerStart(sys.restart, 10000, "系统重启中")
sys.taskInit(function()
while true do
sys.timerStart(sys.restart, 10000, "系统重启中...")
sys.wait(1000)
end
end)
利用这一特性, 我们可以实现类似于软件看门狗的功能. 程序判断某个逻辑运行是否正常, 如果正常则一直覆盖定时器, 如果不正常, 会失去定时器覆盖条件, 从而启动定时器.