在Ruby中,如何将sleep与gets结合使用?我想等待用户响应1分钟,否则继续执行。

5
我正在运行一个循环,在其中使用“gets.chomp”命令等待用户响应。我该如何将其与睡眠/定时器命令结合起来呢?
例如,我希望它等待1分钟,以便用户输入一个单词,否则它将继续返回循环。

超时对我来说确实有效。但是,我还发现了另一种完成此任务的方法:require 'Win32API'@@kbhit = Win32API.new("msvcrt", "_kbhit", [], 'I')for i in 0..60 unless @@kbhit.call.zero? a = gets() break end sleep 1 end if i==60 puts "..." end - RSD
1
那你为什么把某个回答标记为被接受的答案呢? - ryeguy
因为这是一个我尝试过并且有效的优雅解决方案。 - RSD
3个回答

5
你应该查看 Ruby 的 Timeout
文档中写道:
require 'timeout'
status = Timeout::timeout(5) {
  # Something that should be interrupted if it takes too much time...
}

我无法让超时功能正常工作。我的循环包括一个系统调用,我看到 Timeout 模块有时会出现问题。 - RSD
我使用Timeout来包装Net::HTTP和Open::URI调用,这两者都会进行系统调用,而且它们似乎工作正常。 - the Tin Man

1

我认为上面的Timeout方法可能是解决这个问题最优雅的方式。在大多数编程语言中,另一种可用的解决方案是使用select。你需要传递一个要监视的文件描述符列表和一个可选的超时时间。代码不太简洁:

ready_fds = select [ $stdin ], [], [], 10
puts ready_fds.first.first.gets unless ready_fds.nil?

0
怎么样:
def gets_or_timeout(to)
 # Use thread and time limit to wait for a key or refresh after time if no key is hit.
 t=Thread.new{ print "\n> "; gets}
 t.join(to) #wait for end or number of seconds
 t.kill
end

...
gets_or_timeout(60)
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接