摘要:我可以让时间(看起来)通过我的脚本而不需要忙等待吗?使用os.execute('sleep 1')
没有削减它(而且还浪费时间)。
详情
我有a library在特定的时间间隔后确实有效。我目前通过将表注入(inject)按时间排序的列表来安排此操作。大致:
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
我可以强制时间传递我的脚本而不只是忙着等待吗?
最佳答案
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
将时钟提前或延迟任意量。
关于unit-testing - Lua 中增加 os.clock(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23124023/