Как сделать так, чтобы 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
примечание: код не тестировался, и я давно не пользовался компьютерной техникой, поэтому, пожалуйста, исправьте меня, если я допустил ошибку.