2014-09-05 6 views
0

루아의 터미널에서 입력을 읽을 수있는 제한 시간을 설정할 수 있습니다.LUA. 제한 시간이있는 io.read

예를 들어 편지를 쓰려면 1 초 밖에 걸리지 않습니다.이 프로그램을 건너 뛰십시오. 어떤 팁을위한

감사, 루아) 루아 라이브러리)

답변

2

당신은 luaposix (POSIX 기계 만, 분명히)를 사용하여 (man termios 참조) 터미널 설정을 변경하여이 작업을 수행 할 수 있습니다

local p = require("posix") 

local function table_copy(t) 
    local copy = {} 
    for k,v in pairs(t) do 
    if type(v) == "table" then 
     copy[ k ] = table_copy(v) 
    else 
     copy[ k ] = v 
    end 
    end 
    return copy 
end 

assert(p.isatty(p.STDIN_FILENO), "stdin not a terminal") 

-- derive modified terminal settings from current settings 
local saved_tcattr = assert(p.tcgetattr(p.STDIN_FILENO)) 
local raw_tcattr = table_copy(saved_tcattr) 
raw_tcattr.lflag = bit32.band(raw_tcattr.lflag, bit32.bnot(p.ICANON)) 
raw_tcattr.cc[ p.VMIN ] = 0 
raw_tcattr.cc[ p.VTIME ] = 10 -- in tenth of a second 

-- restore terminal settings in case of unexpected error 
local guard = setmetatable({}, { __gc = function() 
    p.tcsetattr(p.STDIN_FILENO, p.TCSANOW, saved_tcattr) 
end }) 

local function read1sec() 
    assert(p.tcsetattr(p.STDIN_FILENO, p.TCSANOW, raw_tcattr)) 
    local c = io.read(1) 
    assert(p.tcsetattr(p.STDIN_FILENO, p.TCSANOW, saved_tcattr)) 
    return c 
end 

local c = read1sec() 
print("key pressed:", c) 
0

lcurses (ncurses를이를 제공 할 수 있습니다. 다운로드하고 설치해야합니다. Create a function to check for key press in unix using ncurses에서만 키 누르기를 확인하는 방법의 예가 있지만, C에 있지만 ncurses API는 Lua에서 동일합니다.

그렇지 않으면 C/C++ API를 사용하여 Lua 확장 모듈을 만들어야합니다. Lua에서 호출하는 C 함수를 만들면이 C 함수는 getch, select, etc (Windows 또는 Linux를 사용하는 경우에 따라 다름).

관련 문제