吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 12099|回复: 14
收起左侧

[其他转载] lua如何支持定时器功能,有相关的模块调用吗

[复制链接]
lyrong 发表于 2017-2-2 17:19
本帖最后由 lyrong 于 2017-2-2 17:53 编辑

我的一款开放式软件是采用的LUA脚本语言,但是定时器功能仅仅支持settimer和killtimer,而我需要的是只执行一次定时器的功能。

为什么要这样的功能就不多说了,只简单介绍下吧:

因为我要多次赋值settimer(),这个时候就尴尬了,因为killtimer只能销毁最后一次赋值的settimer,之前赋值的settimer仍然起作用,但是却无法定位和销毁,就会导致功能冲突。

所以这里请教大家,LUA单线程的如何支持定时器呢?或者有类似功能的模块可以调用吗?

新年快乐,谢谢大家了,一个LUA小白(之前问了群里的人,也查了百度)

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

skyxiaoyu 发表于 2017-2-17 09:24
本帖最后由 skyxiaoyu 于 2017-2-17 09:29 编辑

hi,我下载这个软件看了。你这个需求完全可以用这个软件的API满足啊。
QQ截图20170217092309.png
我写了一份代码。你看看呗。
settimer返回的是定时器的编号。
killtimer指定编号就可以干掉相应的定时器。
很简单的逻辑呀。

[Lua] 纯文本查看 复制代码
--设置定时器,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


代码直接编辑在这里吧,你试试看。
你可以通过在每个定时器里面输出消息来查看定时器是否存活。
skyxiaoyu 发表于 2017-2-5 19:52
hi,lyrong。
lua如果需要使用定时器的功能,最方便的是你需要一个c库的支持。github上很多。
另外:我简单看了一下你的需求,似乎是可以使用coroutine来实现的。
 楼主| lyrong 发表于 2017-2-11 19:07
skyxiaoyu 发表于 2017-2-5 19:52
hi,lyrong。
lua如果需要使用定时器的功能,最方便的是你需要一个c库的支持。github上很多。
另外:我简 ...

谢谢大哥的指点,百度了下github,好像有本地和远程仓库的区别,C库直接下载的没搜索到,另外,这个C库支持直接调用吗?类似这样的语句:

local socket=require("socket") --[[毫秒级计时]]
local timer=socket.gettime()
skyxiaoyu 发表于 2017-2-12 23:32
lyrong 发表于 2017-2-11 19:07
谢谢大哥的指点,百度了下github,好像有本地和远程仓库的区别,C库直接下载的没搜索到,另外,这个C库支 ...

socket库并不包括在lua的源代码中,所以也是第三方进行集成的。
我又仔细看了你的问题,除了确认我之前的回答,我建议你可以打一下settimer的返回值。通常来说,应该会有一个句柄的返回以便进行killtimer,不然api的设计者的脑袋或许是被驴踢过了。

关于lua的timer的c库:
https://github.com/4396/ltimer
这个就是。
 楼主| lyrong 发表于 2017-2-13 14:50
skyxiaoyu 发表于 2017-2-12 23:32
socket库并不包括在lua的源代码中,所以也是第三方进行集成的。
我又仔细看了你的问题,除了确认我之前 ...

谢谢大哥的回复,我是这样操作的

killtimer("a")
a=settimer()

基本解决了我的问题

我想知道,lua是如何调用timer的c库的,下载哪个文件,调用语句是什么?

麻烦大哥你了

QQ图片20170213144815.png
skyxiaoyu 发表于 2017-2-13 15:08
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...
 楼主| lyrong 发表于 2017-2-13 18:50
skyxiaoyu 发表于 2017-2-13 15:08
你太客气了。

killtimer("a")

我在程序中输入以下内容:

local timer = require "timer"
id1 = timer.once(200, function()
    msgdlg('标题', 1, 0)
end)

调试输出的错误文本:

[Error] 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'

QQ图片20170213185010.png
skyxiaoyu 发表于 2017-2-16 20:21
lyrong 发表于 2017-2-13 18:50
我在程序中输入以下内容:

local timer = require "timer"



不是这样用的,c/c++提供的库你必须先编译才可以使用。
或者你可以把你的软件名或者引擎名告诉我,我去看看。
然后告诉你应该怎么使用。
 楼主| lyrong 发表于 2017-2-16 22:56
skyxiaoyu 发表于 2017-2-16 20:21
不是这样用的,c/c++提供的库你必须先编译才可以使用。
或者你可以把你的软件 ...

等了2天,终于等到你了,我也是执着的人,既然有问题,而且是能学到东西,所以还是坚持学会。
我的Q:49921401,软件名字叫:零度魔兽助手5.0,是魔兽争霸3的一款改键工具。
其实只是为了学习调用库的定时器模块。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-27 03:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表