我在这段Lua代码中做错了什么?

这是我的代码

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' (一个 nil 值)

点赞
用户1442917
用户1442917

在 Lua 中没有 sleep 函数,因此您得到了这个错误。如果您可以访问 luasocket,实现您想要的最简单的方法是使用 socket.sleep。在 这个这个 SO 问题中还列出了几个其他选项。

2014-12-29 17:25:32
用户869951
用户869951

Lua并没有提供一个sleep函数。有几种方式可以实现 在Lua wiki上讨论过,可以去看一下。基于socket的解决方案比定时器循环更好,因为它不会让CPU进入忙等状态,但它需要安装第三方的sokets库。在所有解决方案中,你的应用程序不能做其他任何事情,它被困在等待时间流逝的状态中。

你应该问问自己是否真的需要阻止你的线程一段时间,也就是说,为什么不在一个条件被满足之前循环呢?在你的情况下,可以一直循环直到从请求中获得OK状态,或者等待了一段时间后。这样,一旦到达“可以进行”的条件,循环就会结束,但如果需要太长时间才能达到条件,则函数将返回。这样做的另一个好处是,每次通过循环,你可能能给TS应用程序一个处理其他事件的机会。

它看起来像这样(未经测试):

function masspoke(serverConnectionHandlerID, clientID, txt)
    local start = os.clock()  -- 开始计时
    local MAX_WAIT_SECS = 1   -- 等待OK的秒数
    local error = ts3.requestClientPoke(serverConnectionHandlerID, clientID, txt)
    while error ~= ts3errors.ERROR_ok do
        if os.clock() - start > MAX_WAIT_SECS then  -- 太长时间,放弃!
            if error == ts3errors.ERROR_not_connected then
                ts3.printMessage(serverConnectionHandlerID, "错误:未连接")
            else
                print("获取错误:" .. error .. "通过poke ID:" .. clientID)
            end
            return
        end
        error = ts3.requestClientPoke(serverConnectionHandlerID, clientID, txt)
    end
    -- 既然ts poke没问题了,就做任何事情:
    ts3.requestClientPoke(serverConnectionHandlerID, clientID, txt)
end

我认为上面的方法更清晰,意图更清楚。如果你真的想通过socket模块来睡眠主线程,请在masspoke()函数之前加上这个代码:

require "socket"  -- 你需要手动安装socket库
function sleep(sec)
    socket.select(nil, nil, sec)
end

但是,在http://lua-users.org/wiki/SleepFunction上还有其他几个选项,值得尝试(取决于你的平台,以及是否想让你的程序在多个平台上运行),不需要安装第三方库。一定要仔细阅读该页面,并尝试其中所示内容。

2014-12-29 20:57:37