LUA。 io.read有时间限制

时间:2014-09-05 15:47:52

标签: asynchronous input lua

可以设置时间限制来读取Lua中终端的输入。

例如,你只需要1秒钟来写一封信,否则程序会跳过这个动作。

感谢任何提示;)

2 个答案:

答案 0 :(得分:2)

您可以使用man termios更改终端设置(请参阅luaposix)(仅在POSIX计算机上):

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 )

答案 1 :(得分:0)

larses(Lua的ncurses)Lua库可能提供这个。您必须下载并安装它。有一个例子说明如何仅在Create a function to check for key press in unix using ncurses检查按键,它在C中,但是在Lua中ncurses API是相同的。

否则,您将不得不使用C / C ++ API创建一个Lua扩展模块:您将创建从Lua调用的C函数,然后此C函数可以访问操作系统的常用功能,如getch,select等(取决于您是在Windows还是Linux上)。