如何使os.pullEvent不产生yield?

我正在尝试创建一个while true do循环,使用os.pullEvent响应点击事件,并更新显示器。

问题在于,只有当我按下屏幕上的按钮时,它才会更新屏幕,并且我已经发现这是因为pullEvent会停止脚本,直到事件被触发。

有可能使pullEvent不会停止我更新显示器吗?

function getClick()
    event,side,x,y = os.pullEvent("monitor_touch")
    button.checkxy(x,y)
end

local tmp = 0;

while true do
    button.label(2, 2, "Test "..tmp)
    button.screen()
    tmp++
    getClick()
end
点赞
用户4119537
用户4119537

你可以很容易地使用并行 API 来同时运行这两段代码。它的原理是将它们按顺序运行,直到遇到使用 os.pullEvent 的部分,然后切换过去做另一边,如果两边同时停在执行 os.pullEvent 的部分,那么它会一直交替运行,直到其中一个 yield 并从那里继续执行。

local function getClick()
  local event,side,x,y = os.pullEvent("monitor_touch")
  buttoncheckxy(x,y)
end

local tmp = 0
local function makeButtons()
  while true do
    button.label(2,2,"Test "..tmp)
    button.screen()
    tmp++
    sleep(0)
  end
end
parallel.waitForAny(getClick,makeButtons)

现在,如果你注意到了,首先我将你的 while 循环转换成一个函数并在其中添加了 sleep,这样它将被 yield 并允许程序进行切换。最后你会看到 parallel.waitForAny(),它运行了指定的两个函数,当其中一个结束时,也就是当你点击按钮时,它将会结束。请注意,在参数中我没有调用函数,只是传递它们。

2014-10-31 07:11:18
用户4173441
用户4173441

我现在没有 Computercraft,也没有查找函数的能力,但我知道你可以使用函数 os.startTimer(t),它会在 t 秒后触发一个事件(我想是秒)

用法:

update_rate = 1

local _timer = os.startTimer(update_rate)

while true do
    local event = os.pullEvent()

    if event == _timer then
        --updte_screen()
        _timer = os.startTimer(update_rate)
    elseif event == --some oter events you want to take action for
        --action()
    end
end

注意:这段代码没有经过测试,而且我已经有一段时间没有使用 Computercraft,所以如果我犯了错误,请纠正我。

2014-10-31 10:09:50