[编程]lua有暂停运行的函数吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[编程]lua有暂停运行的函数吗?相关的知识,希望对你有一定的参考价值。

lua运行时,可以运行到某处暂缓100毫秒,然后再继续运行吗? 我设置了一个循环体,通过对os.clock不断比较来控制是否退出循环运行下面的代码。问题在于这样太耗cpu了,一个30毫秒要循环几十万次。 手机提问,还不知道会被丢到哪个版块。

如果你是在 Linux 环境下,可以使用如下方法:
os.execute("sleep 0.1s")

如果你是在 Windows 环境下,推荐使用 w32wrappers (https://github.com/luaforge/w32wrappers)
可以使用其中的 w32.Sleep(100) 方法。
参考技术A LUA里面没有pause/sleep之类的函数。
这是因为LUA是用 ANSI C实现的, ANSI C里面没有暂停,所以LUA里面也没有。

下面是一种比较消耗CPU的方法:
local clock = os.clock
function sleep(n)-- seconds
local t0 = clock()
while clock()- t0 <= n do end
end

下面是Windows底下通过调用Windows Host Script的一种方法:
function sleep(n)
local vb = "test.vbs"
local f = assert(io.open(vb,"w"))
f:write("WScript.Sleep(" .. (tonumber(n) * 1000) .. ")\n")
f:close()
os.execute(vb)
end

此外,也可以通过调用ping命令来实现这个功能:
function sleep(n)
if n > 0 then
os.execute("ping -n " .. tonumber(n+1) .. " localhost > NUL")
end
end本回答被提问者和网友采纳
参考技术B Lua的Socket中有这个的啊...不要用那种脑残办法暂停啊 = =

require"socket"
socket.sleep(0.1) --0.1s=100ms

这样多好啊= =追问

不行啊
attempt to call global 'require' (a nil value)

追答

啊喂= =
require函数怎么可能没有= =
require是Lua里面很基本的一个函数,用来加载外部库的= =
你再试试看= =
上面给出的两个函数都是浪费资源的,一个操作了一次文件,一个调用了控制台

追问

大概是因为我的lua环境只是一个程序附带的扩展部分,不是独立的Lua环境
= =b
算了,只要不消耗太大的CPU就能实现暂停功能就可以了。总之也谢谢你了。

追答

socket是Lua很重要的一个库,它提供了大部分的网络资源的说……你去下载一个Lua for Windows 5.1.4或者去搜索Luaet 5.2.1吧= =你不要用那么蛋疼的办法= =而且有luacom库可以直接调用ws你还直接写文件再去运行这不是蛋疼是什么= = = = ==

要学Lua的话尽量去用完整的吧,如果只是临时用一下那随便你了...

暂停的方法是很多的,socket.sleep是最常见和最正常的实现= =

参考技术C LUA没有任何停顿/睡眠功能。
这是因为Lua是在ANSI C,ANSI C实现,没有停顿,没有LUA内。

以下是CPU密集型的方法:

本地时钟= os.clock

功能休眠(N) - 秒

当地T0 =时钟() />时钟() - T0 = N年底

结束

下面的视窗

功能休眠通过调用Windows主机脚本:(N)

当地VB =“Test.vbs的”

当地F =(io.open(VB,“W”))

传真:写(“WScript.Sleep(”..(tonumber(N)* 1000 )..“)\ n”)

传真:关闭()

os.execute(VB)

结束

此外,还可以调用ping命令实现这样的功能:功能休眠(N)

如果n> 0,则

os.execute(“平-N .. tonumber(N +1)的”localhost> NUL “)

的末尾
结束

Lua垃圾收集

Lua使用基于被内置在Lua某些算法的垃圾收集自动内存管理。可以自动内存管理的结果,作为一个开发者:

  • 没有必要担心的对象分配内存。

  • 无需释放他们时,不再需要可将其设置为nil。 

Lua使用运行不时收集死的对象时,不再从Lua程序中访问垃圾收集器。

所有对象,包括表,用户数据,函数,线程,字符串等受自动内存管理。 Lua使用增量标记和使用两个数字来控制其垃圾回收周期即垃圾收集暂停和垃圾收集器的步骤事半功倍清除收集器。这些值是在百分比和100的值是常等于1。

垃圾收集暂停

垃圾收集停顿被用于控制多长时间的垃圾收集器需要等待,之前;它是由Lua的自动内存管理再次调用。数值低于100就意味着Lua中不会等待下一个周期。此值的类似地较高的值将导致垃圾收集器是缓慢的并且性质上较不积极。200表示该集合等待的总内存在使用中要开始一个新的周期开始前的两倍。因此,根据不同的性质和应用的速度,有可能要求改变该值来获得在Lua应用的最佳性能。

垃圾收集器的步骤事半功倍

这一步乘数控制垃圾收集在Lua程序的内存分配的相对速度。较大的步长值将导致垃圾收集器要更侵蚀性,同时也提高了垃圾收集的每个增量步的步长大小。值小于100可能经常导致避免垃圾收集器没有完成其周期和其一般不是优选的。默认值是200,这意味着垃圾收集器运行的两倍的内存分配的速度。

垃圾收集器函数

作为开发人员,我们确实有过让Lua自动内存管理。为此,有以下几种方法。

  • collectgarbage("collect"): 执行垃圾回收的一个完整周期。

  • collectgarbage("count"): 返回当前使用的千字节的程序内存量

  • collectgarbage("restart"): 如果垃圾收集器已经停止,将重新启动它。

  • collectgarbage("setpause"): 设置给定为第二参数除以100至垃圾收集器暂停变量的值。它的用途是作为讨论的一点上面。

  • collectgarbage("setstepmul"): 设置给定为第二参数除以100到垃圾步骤乘数的变量的值。它的用途是作为讨论的一点上面。

  • collectgarbage("step"): 运行垃圾回收的一步。第二个参数是越大step也会变大。在收集的垃圾将返回true,如果触发的步骤是一个垃圾收集周期的最后一步。

  • collectgarbage("stop"): 停止垃圾收集器,如果它的运行。

使用垃圾收集器例如一个简单的例子如下所示。

mytable = {"apple", "orange", "banana"}

print(collectgarbage("count"))

mytable = nil

print(collectgarbage("count"))

print(collectgarbage("collect"))

print(collectgarbage("count"))

当我们运行上面的程序,会得到下面的输出。请注意,这样的结果会有所不同,由于在操作系统中,Lua自动内存管理功能可能也有差异。

20.9560546875
20.9853515625
0
19.4111328125

可以在上面的程序看出,一旦垃圾回收完成后,既可以减少使用内存。但是它也不是强制性的调用。即使我们不给调用,它也会自动在后一阶段在预定时间之后由Lua解释器执行。

显然我们可以改变,如果需要使用垃圾收集器的这些功能行为。这些功能提供了一点额外的能力,为开发者处理复杂情况。根据不同的内存需要执行程序类型,可能会或可能不会使用此功能。但在应用程序的内存使用情况,并在程序本身,以避免在部署后不想要对结果进行检查。

以上是关于[编程]lua有暂停运行的函数吗?的主要内容,如果未能解决你的问题,请参考以下文章

Lua初学笔记

lua程序设计之协同程序

Lua垃圾收集

我可以在方法条目上暂停 Java 运行时以便有时间通过​​调试器或探查器附加吗?

轻松实现Lua编程语言在安卓端运行

javascript和LUA这两个脚本语言哪个强一些?