在Lua中递增os.clock()。
2014-4-17 3:19:44
收藏:0
阅读:172
评论:2
摘要: 我能否让时间(表面上)在我的脚本中流逝,而不是忙等待?使用 os.execute('sleep 1') 不能解决问题(还浪费时间)。
详情:
我有一个库进行特定时间间隔的工作。我目前通过将表插入按时间排序的列表中来计划这个库。大致而言:
local delayedWork = {}
function handleLater( data, delaySeconds )
local delayedItem = { data=data, execTime=os.clock() + delaySeconds }
local i=1
for _,existing in ipairs(delayedWork) do
if existing.execTime > delayedItem.execTime then break else i=i+1 end
end
table.insert(delayedWork,i,delayedItem)
end
稍后,我会定期检查是否有工作要做。大致如下:
function processDelayedWork()
local i,last = 1,#delayedWork
while i<=last do
local delayedItem = delayedWork[i]
if delayedItem.execTime <= os.clock() then
table.remove(delayedWork,i)
-- use delayedItem.data
last = last-1
else
i=i+1
end
end
end
(这使用 CPU 时间而不是墙钟时间的事实是另一个问题。我反复在处理期间移动数组而不是一个紧凑的操作是一个不相关的优化。)
当我正在运行系统的单元测试时,我需要让时间过去,最好比正常更快。但是,调用 os.execute('sleep 1') 消耗一个墙钟秒,但不会导致 os.clock() 增加。
$ lua -e "require 'os' print(os.clock()) os.execute('sleep 1') print(os.clock())"
0.002493
0.002799
我无法使用 os.time() 因为这只有整数秒数(在编译为使用数字的 float 而不是 double 的系统上小于这些数字):
$ lua -e "require 'os' print(os.time()) os.execute('sleep 0.4') print(os.time())"
1397704209
1397704209
我能否在不忙等待的情况下强制时间流逝我的脚本?
点赞
用户1442917
为什么不编写您自己的时钟函数来实现您想要的功能?
do
local clock = os.clock
local increment = 0
os.clock = function(inc)
increment = increment + (inc or 0)
return clock()+increment
end
end
print(os.clock())
os.clock(1)
print(os.clock())
这将输出 0.001 1.001 或类似的内容。
2014-04-17 04:40:58
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
Paul已经回答过这个问题了:让
os.clock返回你需要的内容。我添加了一个实现,可以让你控制
os.clock报告的时间流逝速度。do local realclock = os.clock local lasttime = realclock() local faketime = lasttime local clockMultiplier = 1 function setClockMultiplier(multiplier) clockMultiplier = multiplier end function adjustTime(offsetAmount) faketime = faketime + offsetAmount end function os.clock() local now = realclock() adjustTime((now - lasttime) * clockMultiplier) lasttime = now return faketime end end现在你可以调用
setClockMultiplier自由减缓或加速os.clock汇报的时间流逝。你也可以通过调用adjustTime方法,让时钟向前或向后移动任意数量。