我无法弄清楚如何让lua做任何常见的计时技巧,比如
sleep - 停止线程上的所有操作
暂停/等待 - 不要继续执行下一个命令,但允许应用程序中的其他代码继续
block - 在当前命令返回之前不要继续执行下一个命令
我读过那个
while os.clock()吃掉CPU时间.
有什么建议?我缺少一个API调用吗?
更新:我很久以前写过这个问题试图让WOW Lua按计划重播动作(即站立,等待1秒,跳舞,等待2秒,坐下.没有停顿,这些几乎都发生在同一季度. )事实证明,WOW故意禁用了几乎所有允许在时钟上执行操作的内容,因为它可能会破坏游戏或启用机器人.我想要在它被带走后重新创建一个时钟,我必须做一些疯狂的事情,比如创建一个工作数组(有一个动作和执行时间),然后在一堆常见事件上注册一个事件处理程序,比如鼠标移动,然后在偶数处理程序中,处理任何时间已到的动作.事件处理程序实际上不会每X毫秒发生一次,但如果它每隔2-100毫秒发生一次,它就足够接近了.可悲的是,我从未尝试过.
1> zslayton..:[我打算将此作为评论约翰克罗马蒂的帖子,但没有意识到你不能在评论中使用格式.]
我同意.使用os.execute()将它删除到shell肯定会起作用,但通常使shell调用很昂贵.在运行时包装一些C代码会更快.在Linux系统上的C/C++中,您可以使用:
static int lua_sleep(lua_State *L) { int m = static_cast(luaL_checknumber(L,1)); usleep(m * 1000); // usleep takes microseconds. This converts the parameter to milliseconds. // Change this as necessary. // Alternatively, use 'sleep()' to treat the parameter as whole seconds. return 0; } 然后,在main中,执行:
lua_pushcfunction(L, lua_sleep); lua_setglobal(L, "sleep");其中"L"是你的lua_State.然后,在从C/C++调用的Lua脚本中,您可以通过调用以下函数来使用您的函数:
sleep(1000) -- Sleeps for one second
2> Michal Kottm..:如果您碰巧在项目中使用了LuaSocket,或者只是安装了它并且不介意使用它,您可以使用
socket.sleep(time)
睡眠一段时间(以秒为单位)的功能.这适用于Windows和Unix,您无需编译其他模块.
我应该补充说,该函数支持小数秒作为参数,
socket.sleep(0.5)
即将睡眠半秒.它Sleep()
在Windows和nanosleep()
其他地方使用,因此time
在太低时可能会出现Windows准确性问题.
3> Kknd..:你不能在没有吃CPU的情况下在纯Lua中做到这一点,但是有一种简单,不可移植的方式:
os.execute("睡眠1")
(它会阻止)
显然,这仅适用于"sleep 1"是有效命令的操作系统,例如Unix,而不是Windows.
4> 小智..:对于Windows,你可以这样做:
os.execute("CHOICE /n /d:y /c:yn /t:5")
5> Joe DF..:睡眠功能 - 用法:
sleep(1) -- sleeps for 1 second
local clock = os.clock function sleep(n) -- seconds local t0 = clock() while clock() - t0 <= n do end end暂停功能 - 用法:
pause() -- pause and waits for the Return key
function pause() io.stdin:read'*l' end希望,这就是你所需要的!:D - Joe DF