2013-03-28 2 views
0

Я пытаюсь прочитать ввод пользователя в консольном интерфейсе в приложении Lua. Однако я не хочу останавливать выполнение программы, как предполагает название. Использование read() будет мешать нормальной обработке текущих событий и обновлению интерфейса при вводе пользователем.Чтение ввода пользователя без остановки выполнения

Лучшее решение, которое я мог придумать, состоял в том, чтобы сохранить временную переменную. Я применяю любой пользовательский ввод, который не является функциональным ключом. Однако мой обработчик событий возвращает scancodes, и я не знаю, как их сопоставить с кодами ASCII, не поддерживая таблицу для каждого ключа, чего я действительно хочу избежать.

Любые идеи?

Редактировать Чтобы дать пример того, что я имею в виду:

function read_input() 
local input = read() 
do_something_with(input) 
end 
while true do 
e,param1,param2,param3 = os.pullEvent() 
if (e=='key' and param1=='201') then 
    read_input() 
elseif (e=='something_else') then 
    do_something_else() 
end 
end 

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

+1

Откуда вы получаете эту функцию 'os.pullEvent'? –

+0

Его computercraft. minecraft mod – SReject

+0

Попробуйте использовать 'coroutines', или если minecraft предоставляет что-то подобное таймер-обработчику событий. – hjpotter92

ответ

0

Вы должны прочитать ключи непрерывно от os.pullEvent()

local input 
while true do 
    e,param1,param2,param3 = os.pullEvent() 
    if (e=='key') then 
    -- do some fancy stuff for checking which key has pressed and append it to input 
    -- additionally if it's enter do something other fancy 
    else 
    -- blah blah 
    end 
end 

Я не уверен, но я думал, характер которого была нажата клавиша находится в одном из Params в pullEvent , Я мог бы ошибаться.

Кроме того, если вы хотите что-то делать каждую секунду или около того, запустите таймер, который также запускает pullEvent.

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