0

我正在尝试创建一个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
4

2 回答 2

4

您可以轻松地使用并行 api 基本上同时运行两个代码。它的工作原理是它按顺序运行它们,直到它碰到使用的东西,os.pullEvent然后交换并做另一边,如果两者都停在做的东西上,os.pullEvent那么它会不断交换,直到一个产生并从那里继续。

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,以便它产生并允许程序交换。最后,您会看到parallel.waitForAny()哪个运行指定的两个函数以及其中一个函数何时完成,在这种情况下,只要您单击一个按钮,它就会结束。但是请注意,在我没有调用函数的参数中,我只是在传递它们。

于 2014-10-31T07:11:18.073 回答
0

我现在手头没有电脑或查找功能,但我知道您可以使用功能 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

注意:代码未经测试,我很长一段时间没有使用计算机技术,所以如果我做错了,请纠正我。

于 2014-10-31T10:09:50.930 回答