这个Lua代码我做错了啥
Posted
技术标签:
【中文标题】这个Lua代码我做错了啥【英文标题】:What am I doing wrong with this Lua code这个Lua代码我做错了什么 【发布时间】:2015-02-25 18:25:12 【问题描述】:这是我的代码
function masspoke(serverConnectionHandlerID, clientID, txt)
local error = ts3.requestClientPoke(serverConnectionHandlerID, clientID, txt)
sleep(1)
local error = ts3.requestClientPoke(serverConnectionHandlerID, clientID, txt)
if error == ts3errors.ERROR_not_connected then
ts3.printMessage(serverConnectionHandlerID, "Error: Not Connected")
return
elseif error ~= ts3errors.ERROR_ok then
print("Getting Error: " .. error .. "by poking the ID: " .. clientID)
return
end
ts3.requestClientPoke(serverConnectionHandlerID, clientID, txt)
end
我的错误是
尝试调用全局“睡眠”(零值)
【问题讨论】:
错误信息很清楚:你正在调用一个名为sleep
的未定义全局函数。
好的,那么我如何在我希望它睡觉的地方添加暂停
您在某个库中发现了一个 sleep 函数,该函数自己从 C 中公开或绑定一个。
【参考方案1】:
Lua 不提供睡眠功能。有几种方法可以实现一个as discussed on the Lua wiki,一定要看看。基于套接字的解决方案是比计时器循环更好的选择,因为它不会旋转 CPU(保持忙碌),但它需要您安装第三方 sockets
库。在所有解决方案中,您的应用都无法执行任何其他操作,它一直在等待时间过去。
你应该问你是否真的需要阻塞你的线程一段时间,即为什么不循环直到满足某个条件。在您的情况下,这可能是循环的,直到从请求中获得 OK 状态,或者经过了一定的时间。这样,一旦达到“继续”条件,循环就会结束,但如果达到条件的时间过长,函数将返回。这样做的另一个好处是,您可以让 TS 应用有机会在每次循环中处理其他事件。
看起来像这样(未经测试):
function masspoke(serverConnectionHandlerID, clientID, txt)
local start = os.clock() -- start timing
local MAX_WAIT_SECS = 1 -- seconds to wait for OK
local error = ts3.requestClientPoke(serverConnectionHandlerID, clientID, txt)
while error ~= ts3errors.ERROR_ok do
if os.clock() - start > MAX_WAIT_SECS then -- too long, give up!
if error == ts3errors.ERROR_not_connected then
ts3.printMessage(serverConnectionHandlerID, "Error: Not Connected")
else
print("Getting Error: " .. error .. "by poking the ID: " .. clientID)
end
return
end
error = ts3.requestClientPoke(serverConnectionHandlerID, clientID, txt)
end
-- now that ts poke is ok, do whatever:
ts3.requestClientPoke(serverConnectionHandlerID, clientID, txt)
end
我认为上面是一种更干净的方法,意图更清晰。如果你真的想通过 socket 模块让主线程休眠,那么把它放在你的 masspoke()
函数之前:
require "socket" -- you need to install socket lib manually
function sleep(sec)
socket.select(nil, nil, sec)
end
但是http://lua-users.org/wiki/SleepFunction 上还有其他几个值得尝试的选项(取决于您的平台,以及您是否希望您的 prog 在多个平台上运行)不需要安装第三方库.请务必仔细阅读该页面并尝试它显示的内容。
【讨论】:
什么是循环语法,放在哪里 或者我在哪里以及如何实现基于套接字的解决方案【参考方案2】:Lua 中没有 sleep
函数,因此出现了错误。如果您可以访问 luasocket,最简单的方法是使用 socket.sleep。 this 和 this SO 问题中还列出了其他几个选项。
【讨论】:
我已经尝试了套接字睡眠,但我仍然得到同样的错误>尝试索引全局“套接字”(一个零值) @JoseSeverino,你需要在调用socket.sleep
之前使用local socket = require "socket"
。以上是关于这个Lua代码我做错了啥的主要内容,如果未能解决你的问题,请参考以下文章