使lua脚本等待/暂停/睡眠/阻止几秒钟的最简单方法?

问题描述 投票:32回答:19

我不知道如何让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进行任何常见的计时技巧,例如休眠-在线程暂停/等待时停止所有操作-不要继续执行下一个命令,而是允许应用程序中的其他代码执行.. 。

lua
19个回答
4
投票

没有比这容易的事情了。睡眠可以在您的FLTK或任何其他方式中实现,但这涵盖了进行标准类型的系统睡眠的所有最佳方法,而无需特殊的事件中断。看哪:


3
投票

2
投票

我同意约翰包装睡眠功能。您还可以使用此包装的睡眠函数在lua中实现暂停功能(该函数将简单地睡眠然后检查某个条件是否经常改变)。另一种方法是使用钩子。

我不确定您对第三个项目符号的意思(命令通常不会在执行下一个项目之前完成吗?)但是钩子也可以帮助解决这个问题。


2
投票

您可以使用:

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)

1
投票

您想要Question: How can I end a Lua thread cleanly?,方法。

是的,您绝对不想像您描述的那样进行繁忙的等待。


1
投票

将Alien用作libc / msvcrt包装器也很容易:

os.execute("sleep 1") -- I think you can do every command of CMD using os.execute("command")

1
投票

我从Lua开始,但是后来我发现我想要查看结果,而不仅仅是旧的命令行刷新。所以我只是将以下行添加到我的文件中,嘿,请告诉我,标准:

win.Sleep(milliseconds)

1
投票

我相信对于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') 之间有空格)


0
投票

这应该起作用:

please press any key to continue...

os.execute("PAUSE")

0
投票
os.execute("ping 1.1.1.1 /n 1 /w <time in milliseconds> >nul

0
投票

您可以这样做:

>nul

21
投票

[[我打算将其发布为John Cromartie's帖子的评论,但没有意识到您不能在评论中使用格式。]


19
投票

[如果您碰巧在项目中使用LuaSocket,或者只是安装了它而又不介意使用它,则可以使用socket.sleep(time)函数,该函数可以休眠指定的时间(以秒为单位)。] >

这在Windows和Unix上都有效,并且您不必编译其他模块。


10
投票

您不能在不消耗CPU的情况下以纯Lua的方式进行操作,但是有一种简单,不可移植的方法:


8
投票

对于Windows,您可以这样做:

nanosleep()

7
投票

睡眠功能-用法:nanosleep()


3
投票

我将实现一个简单的功能,将主机系统的睡眠功能包装在C中。


3
投票

[Pure Lua仅使用ANSI标准C中的内容。Luiz Figuereido的local clock = os.clock function sleep(n) -- seconds local t0 = clock() while clock() - t0 <= n do end end 包含了许多需要做更多系统性工作的内容。


3
投票

对于第二个请求,暂停/等待,在Lua中停止处理并继续运行您的应用程序时,需要协同程序。您最终得到一些如下的C代码:

pause() -- pause and waits for the Return key
© www.soinside.com 2019 - 2024. All rights reserved.