我不知道如何让lua进行任何常见的计时技巧,例如
sleep-停止对线程的所有操作
暂停/等待-不要继续下一个命令,但允许在申请继续
块-直到当前返回]]
而且我读过一个
while os.clock()<time_point do --nothing end
占用CPU时间。
有什么建议吗?我是否缺少API调用?
UPDATE
:很久以前,我写了这个问题,试图让WOW Lua按计划重播动作(即站立,等待1秒,跳舞,等待2秒,坐着。没有停顿,这些几乎都会发生As it turned out WOW had purposely disabled pretty much everything that allows doing action on a clock because it could break the game or enable bots.我想在时钟被拿走后重新创建一个时钟,我必须做一些疯狂的事情,例如创建一个工作数组(带有动作和执行时间),然后注册一个事件处理程序,用于处理一系列常见事件,例如鼠标移动,然后在偶数处理程序中,处理时间已到的任何操作。事件处理程序实际上不会每隔X毫秒发生一次,但是如果每2到100毫秒发生一次,则它足够接近。可悲的是我从未尝试过。我无法弄清楚如何使lua进行任何常见的计时技巧,例如休眠-在线程暂停/等待时停止所有操作-不要继续执行下一个命令,而是允许应用程序中的其他代码执行.. 。
没有比这容易的事情了。睡眠可以在您的FLTK或任何其他方式中实现,但这涵盖了进行标准类型的系统睡眠的所有最佳方法,而无需特殊的事件中断。看哪:
我同意约翰包装睡眠功能。您还可以使用此包装的睡眠函数在lua中实现暂停功能(该函数将简单地睡眠然后检查某个条件是否经常改变)。另一种方法是使用钩子。
我不确定您对第三个项目符号的意思(命令通常不会在执行下一个项目之前完成吗?)但是钩子也可以帮助解决这个问题。
您可以使用:
function try_pause (func, param)
local rc=func(param)
while rc == false do
coroutine.yield()
rc=func(param)
end
end
function is_data_ready (data)
local rc=true
-- check if data is ready, update rc to false if not ready
return rc
end
try_pause(is_data_ready, data)
您想要Question: How can I end a Lua thread cleanly?,方法。
是的,您绝对不想像您描述的那样进行繁忙的等待。
将Alien用作libc / msvcrt包装器也很容易:
os.execute("sleep 1") -- I think you can do every command of CMD using os.execute("command")
我从Lua开始,但是后来我发现我想要查看结果,而不仅仅是旧的命令行刷新。所以我只是将以下行添加到我的文件中,嘿,请告诉我,标准:
win.Sleep(milliseconds)
我相信对于Windows,您可以使用:> luarocks install alien
作为简单的计时器。(插入时间(以毫秒为单位时,请删除“ <>”))(其余代码和require 'alien'
if alien.platform == "windows" then
-- untested!!
libc = alien.load("msvcrt.dll")
else
libc = alien.default
end
usleep = libc.usleep
usleep:types('int', 'uint')
function sleep(ms)
while ms > 1000 do
usleep(1000)
ms = ms - 1000
end
usleep(1000 * ms)
end
print('hello')
sleep(500) -- sleep 500 ms
print('world')
之间有空格)
这应该起作用:
please press any key to continue...
os.execute("PAUSE")
os.execute("ping 1.1.1.1 /n 1 /w <time in milliseconds> >nul
您可以这样做:
>nul
[[我打算将其发布为John Cromartie's帖子的评论,但没有意识到您不能在评论中使用格式。]
[如果您碰巧在项目中使用LuaSocket,或者只是安装了它而又不介意使用它,则可以使用socket.sleep(time)
函数,该函数可以休眠指定的时间(以秒为单位)。] >
这在Windows和Unix上都有效,并且您不必编译其他模块。
您不能在不消耗CPU的情况下以纯Lua的方式进行操作,但是有一种简单,不可移植的方法:
对于Windows,您可以这样做:
nanosleep()
睡眠功能-用法:nanosleep()
我将实现一个简单的功能,将主机系统的睡眠功能包装在C中。
[Pure Lua仅使用ANSI标准C中的内容。Luiz Figuereido的local clock = os.clock
function sleep(n) -- seconds
local t0 = clock()
while clock() - t0 <= n do
end
end
包含了许多需要做更多系统性工作的内容。
对于第二个请求,暂停/等待,在Lua中停止处理并继续运行您的应用程序时,需要协同程序。您最终得到一些如下的C代码:
pause() -- pause and waits for the Return key