在 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 分钟,否则继续的主要内容,如果未能解决你的问题,请参考以下文章
我的第一个 R Shiny,我如何将 selectinput 与 renderplot(ggplot) 结合起来?