【问题标题】:Lua: run code while waiting for inputLua:在等待输入时运行代码
【发布时间】:2021-08-08 16:20:53
【问题描述】:

我目前正在开发一个 lua 程序。 我想在 Minecraft 中使用一个名为“OpenComputers”的 mod,它允许在模拟系统上使用 lua 脚本。 我正在处理的程序相对简单:你有一个控制台,你输入一个命令来控制一台机器。 它看起来像这样:

while(true) do
  io.write("Enter command\n>")
  cmd = io.read()
  -- running code to process the command
end

但问题是:我需要在后台运行一个例程来检查机器提供的数据。

while(true) do
  -- checking and reacting
end

我怎样才能做到这一点?

  • 等待io.read()时无法跳转到协程
  • 在有人使用命令后检查是不够的(有时我几天不使用它,但我仍然需要密切关注它)

我对 lua 比较陌生,所以请尝试提供一个简单的解决方案,并且 - 如果可能的话 - 一个不依赖第三方工具的解决方案。

谢谢你:)

【问题讨论】:

  • 就我所理解的协程而言,它们是可以通过 yield() 暂停并在稍后继续的函数。我需要的是在主循环运行时运行的东西。类似于 C# 中的第二个线程。
  • 可能有一个 os.Event 可以监听看看输入是否可用
  • 其实是有的。另外,@BDevGW,线程在 opencomputers 中的使用相当有限,如果您是 opencomputers 的新手,我不建议您使用它们......您应该使用事件处理(或计时器)和协程。

标签: lua minecraft opencomputers


【解决方案1】:

如果您对 opencomputers 有一定的经验,您可以为“key_down”添加一个(n 异步)侦听器,并将用户输入存储在一个字符串(或任何您想要的)中。

例如:

local userstr = ""
function keyPressed(event_name, player_uuid, ascii)
    local c = string.char(ascii)
    if c=='\n' then
        print(userstr)
        userstr = ""
    else
        userstr=userstr..c
    end
    --stores keys typed by user and prints them as a string when you press enter
end

event.register("key_down", keyPressed)

【讨论】:

    【解决方案2】:

    运行多个任务是操作系统解决的一个非常广泛的问题,而不是像 Lua 解释器那样简单的东西。它在比io.read 更深的层次上得到解决,并且处理的麻烦足以填满几本书。对于 lua vm 而不是物理计算机,它可能更简单,但仍然需要深入研究如何将代码字母转换为计算机执行的操作。

    你的那个模组似乎已经为你模拟了操作系统功能:1,2。我相信通过使用所提供的功能你会变得更好。

    【讨论】:

    • 我尝试使用“线程”API,但与协程一样,只有第一次运行,第二次 dosnt 启动。
    • 线程慢,占用大量内存。你想要的是事件处理。
    猜你喜欢
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 2023-03-26
    • 2012-06-12
    • 2016-10-06
    • 2020-05-09
    相关资源
    最近更新 更多