Как сделать так, чтобы os.pullEvent не поддавался?

Я пытаюсь создать 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

2 ответа

Решение

Вы можете легко использовать параллельный 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 в функцию и добавил в нее спящий режим, чтобы он приводил к обмену программой. В конце вы видите parallel.waitForAny() который запускает две указанные функции и когда одна из них завершается, что в этом случае всякий раз, когда вы нажимаете на кнопку, затем завершается. Однако обратите внимание, что внутри аргументов я не вызываю функции, я просто передаю их.

У меня нет сейчас под рукой компьютерного ремесла или я ищу функции, но я знаю, что вы можете использовать функцию 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

примечание: код не тестировался, и я давно не пользовался компьютерной техникой, поэтому, пожалуйста, исправьте меня, если я допустил ошибку.

Другие вопросы по тегам