【问题标题】:Lua - It is possible to stop inputs while "ex.sleep" is running?Lua - “ex.sleep”运行时可以停止输入吗?
【发布时间】:2019-05-23 22:02:32
【问题描述】:

我无法在互联网上弄清楚或找到的基本内容: 我用于测试的小代码很简单:

require("ex")

a = true
b = nil

while (a == true) do
    b = io.read()
    ex.sleep(5)
    print(b)
end

非常简单。如果我输入“1”(我正在使用 notepad++ 和 windows 命令提示符),它将等待 5 秒并打印,然后重复。但是我的问题是……如果我在睡眠的5秒内输入更多的数字,那么在睡眠结束时,它会自动依次执行。

可以阻止吗?我不希望在那段时间读取任何输入。这些“幽灵”输入存储在哪里?

【问题讨论】:

    标签: input lua sleep


    【解决方案1】:

    您可以通过以字节为单位的“缓冲区大小”参数来控制读取:

    b = io.read(1)
    

    在这种情况下,读取在从输入中获取第一个字节后完成。其余输入字节将可用于下一个“读取”语句。 重要提示:如果输入“1”并按“Enter”,则将有3个字节供读取(包括“\r\n”)。

    详情请见https://www.lua.org/pil/21.1.html

    此外,您想知道在下次读取之前清理输入缓冲区的方法。这很简单:使用 io.read("*line") 语句如下:

    b = io.read("*line")  -- suppose, input is: "1234"
    b = string.sub(b, 0, 1)
    print(b)              -- prints 1
    
    b = io.read("*line")  -- suppose, input is: "567"
    b = string.sub(b, 0, 1)
    print(b)              -- prints 5
    
    b = io.read("*line")  -- suppose, input is: ""
    b = string.sub(b, 0, 1)
    print(b)              -- prints empty string
    

    io.read("*line") 从输入中获取整行,但您只能从中获取第一个字符。

    【讨论】:

    • 这实际上很高兴知道。但是我怎么能用它来解决我的问题呢?就像,“ Rest input bytes 将可用于下一个“read”语句 ”,就是这样,我不希望它可用。是否可以在调用 io.read() 之前清除任何输入?
    • 我已经扩展了我对这个案例的回答
    • 很抱歉再次打扰您,但是当我尝试运行您的代码时,它卡在了循环中。也许是我的 Lua 的问题?
    • 对不起。你有正确的 Lua 版本))。我已经对代码进行了修改以显示更好的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    相关资源
    最近更新 更多