这个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代码我做错了啥的主要内容,如果未能解决你的问题,请参考以下文章

试图设置背景图片,但 div id 名称没有显示在后面的代码中,我做错了啥?

Cylinder VBO OpenGL:我做错了啥?

请帮我!我不知道我做错了啥[关闭]

这个简单的模板类我做错了啥?

这个 GraphQL 查询我做错了啥?

“0x00000000 处的第一次机会异常”我做错了啥?