2014-10-30 4 views
0

Я пытаюсь создать цикл while true do, который реагирует на клики, используя os.pullEvent, а также обновляет монитор.Как сделать 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

Вы можете легко использовать параллельный 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) 

Теперь, если вы заметили, первую вещь, я сделал свое время цикл в функцию и добавил сон внутри нее, так что она дает и позволяет программе поменять. В конце вы видите parallel.waitForAny(), который запускает две указанные функции и когда один из них заканчивается, что в этом случае всякий раз, когда вы нажимаете кнопку, заканчивается. Обратите внимание, что внутри аргументов, которые я не называю функциями, я просто передаю их.

+0

Я попробую, когда я получу, спасибо :). Я смотрел на сопрограмму, но я не мог понять это вообще. –

0

у меня нет под рукой computercraft прямо сейчас или посмотреть функции, но я знаю, что вы можете использовать функцию os.startTimer (т), что вызовет событие в т секундах (я думаю, что это секунда)

использование:

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 в довольно долгое время, так мольбы, поправьте меня, если я сделал ошибку.

Смежные вопросы