lua如何支持定时器功能,有相关的模块调用吗
本帖最后由 lyrong 于 2017-2-2 17:53 编辑我的一款开放式软件是采用的LUA脚本语言,但是定时器功能仅仅支持settimer和killtimer,而我需要的是只执行一次定时器的功能。
为什么要这样的功能就不多说了,只简单介绍下吧:
因为我要多次赋值settimer(),这个时候就尴尬了,因为killtimer只能销毁最后一次赋值的settimer,之前赋值的settimer仍然起作用,但是却无法定位和销毁,就会导致功能冲突。
所以这里请教大家,LUA单线程的如何支持定时器呢?或者有类似功能的模块可以调用吗?
新年快乐,谢谢大家了,一个LUA小白(之前问了群里的人,也查了百度)
{:301_1009:} 本帖最后由 skyxiaoyu 于 2017-2-17 09:29 编辑
hi,我下载这个软件看了。你这个需求完全可以用这个软件的API满足啊。
我写了一份代码。你看看呗。
settimer返回的是定时器的编号。
killtimer指定编号就可以干掉相应的定时器。
很简单的逻辑呀。
--设置定时器,2秒执行一次func_first
time_first = settimer(2000, 'func_first')
function func_first()
--每2秒到达这里
--启动2号定时器,4秒后触发
time_sec = settimer(4000, 'func_sec')
end
function func_sec()
--2号定时器启动后,在同时启动3个定时器
time_1th = settimer(2000, 'func_1th')
time_2th = settimer(2000, 'func_2th')
time_3th = settimer(2000, 'func_3th')
end
function func_1th()
--干掉1号和2号定时器
killtimer(time_first)
killtimer(time_sec)
end
function func_2th()
msgbox('func_2th定时器')
end
function func_3th()
--干掉2th定时器
killtimer(time_2th)
end
代码直接编辑在这里吧,你试试看。
你可以通过在每个定时器里面输出消息来查看定时器是否存活。 hi,lyrong。
lua如果需要使用定时器的功能,最方便的是你需要一个c库的支持。github上很多。
另外:我简单看了一下你的需求,似乎是可以使用coroutine来实现的。 skyxiaoyu 发表于 2017-2-5 19:52
hi,lyrong。
lua如果需要使用定时器的功能,最方便的是你需要一个c库的支持。github上很多。
另外:我简 ...
谢谢大哥的指点,百度了下github,好像有本地和远程仓库的区别,C库直接下载的没搜索到,另外,这个C库支持直接调用吗?类似这样的语句:
local socket=require("socket") --[[毫秒级计时]]
local timer=socket.gettime() lyrong 发表于 2017-2-11 19:07
谢谢大哥的指点,百度了下github,好像有本地和远程仓库的区别,C库直接下载的没搜索到,另外,这个C库支 ...
socket库并不包括在lua的源代码中,所以也是第三方进行集成的。
我又仔细看了你的问题,除了确认我之前的回答,我建议你可以打一下settimer的返回值。通常来说,应该会有一个句柄的返回以便进行killtimer,不然api的设计者的脑袋或许是被驴踢过了。
关于lua的timer的c库:
https://github.com/4396/ltimer
这个就是。 skyxiaoyu 发表于 2017-2-12 23:32
socket库并不包括在lua的源代码中,所以也是第三方进行集成的。
我又仔细看了你的问题,除了确认我之前 ...
谢谢大哥的回复,我是这样操作的
killtimer("a")
a=settimer()
基本解决了我的问题
我想知道,lua是如何调用timer的c库的,下载哪个文件,调用语句是什么?
麻烦大哥你了
lyrong 发表于 2017-2-13 14:50
谢谢大哥的回复,我是这样操作的
killtimer("a")
你太客气了。
killtimer("a")
这样写的话,是字符串而不是对象啊。这样怎么kill掉啊。正常的做法不应该是这样吗:
local timer_first = settimer()
local timer_sec = settimer()
killtimer(timer_first)
killtimer(timer_sec)
至于怎么使用,你clone一份,看看timer.lua的用法就知道了。和socket都是类似的。比如是这样的:
local timer = require("timer")
time... skyxiaoyu 发表于 2017-2-13 15:08
你太客气了。
killtimer("a")
我在程序中输入以下内容:
local timer = require "timer"
id1 = timer.once(200, function()
msgdlg('标题', 1, 0)
end)
调试输出的错误文本:
F:\Program Files\AWar_WG\A-Game\-AWar-\lua\timer.lua:1: module 'ltimer' not found:
no field package.preload['ltimer']
no file '.\ltimer.lua'
no file 'F:\Program Files\AWar_WG\A-Game\-AWar-\lua\ltimer.lua'
no file 'F:\Program Files\AWar_WG\A-Game\-AWar-\lua\ltimer\init.lua'
no file 'F:\Program Files\AWar_WG\A-Game\-AWar-\ltimer.lua'
no file 'F:\Program Files\AWar_WG\A-Game\-AWar-\ltimer\init.lua'
no file '.\ltimer.dll'
no file 'F:\Program Files\AWar_WG\A-Game\-AWar-\ltimer.dll'
no file 'F:\Program Files\AWar_WG\A-Game\-AWar-\loadall.dll'
lyrong 发表于 2017-2-13 18:50
我在程序中输入以下内容:
local timer = require "timer"
{:1_908:}:funk:eweqw
不是这样用的,c/c++提供的库你必须先编译才可以使用。
或者你可以把你的软件名或者引擎名告诉我,我去看看。
然后告诉你应该怎么使用。 skyxiaoyu 发表于 2017-2-16 20:21
不是这样用的,c/c++提供的库你必须先编译才可以使用。
或者你可以把你的软件 ...
等了2天,终于等到你了,我也是执着的人,既然有问题,而且是能学到东西,所以还是坚持学会。
我的Q:49921401,软件名字叫:零度魔兽助手5.0,是魔兽争霸3的一款改键工具。
其实只是为了学习调用库的定时器模块。
页:
[1]
2