在 Ruby 中,我如何将睡眠与获取结合起来?我想等待用户响应 1 分钟,否则继续

Posted

技术标签:

【中文标题】在 Ruby 中,我如何将睡眠与获取结合起来?我想等待用户响应 1 分钟,否则继续【英文标题】:In Ruby, how do I combine sleep with gets? I want to wait for user response for 1 min, otherwise continue 【发布时间】:2011-09-08 02:01:21 【问题描述】:

我正在运行一个循环,在其中我使用“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 那你为什么将某事标记为已接受的答案? 因为它是我尝试过并且有效的优雅解决方案 【参考方案1】:

你应该看看 Ruby 的Timeout

来自文档:

require 'timeout'
status = Timeout::timeout(5) 
  # Something that should be interrupted if it takes too much time...

【讨论】:

我无法让超时工作。我的循环包括一个系统调用,我读到 Timeout 模块有时似乎有问题。 好吧,我使用 Timeout 来包装 Net::HTTP 和 Open::URI 调用,它们都进行系统调用,而且这些调用似乎都有效。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

怎么样:

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)
...

【讨论】:

以上是关于在 Ruby 中,我如何将睡眠与获取结合起来?我想等待用户响应 1 分钟,否则继续的主要内容,如果未能解决你的问题,请参考以下文章

如何将 SQLite 数据库与片段结合起来?

如何将填充段落与 supercite 结合起来?

我的第一个 R Shiny,我如何将 selectinput 与 renderplot(ggplot) 结合起来?

MySql如何将LEFT JOIN查询与NOT IN查询结合起来

电脑睡眠后启动不起来

如何将 UIView 中绘制的像素与 UIImageView 中的图像结合起来,并将其保存为新图像?