在Ruby中制作计时器

use*_*354 2 ruby timer

我想在Ruby中创建一个计时器,在用户选择一定时间后,计时器响起或弹出一条消息.此外,是否有可能使定时器响铃直到用户做某件事(例如数学问题)?

Cat*_*per 5

使用线程:

user_input = Thread.new do
  print "Enter something: "
  Thread.current[:value] = gets.chomp
end

timer = Thread.new { sleep 3; user_input.kill; puts }

user_input.join
if user_input[:value]
  puts "User entered #{user_input[:value]}"
else
  puts "Timer expired"
end
Run Code Online (Sandbox Code Playgroud)

这段代码中运行了三个线程:

  1. user_input线程从用户获取一个字符串并设置其value线程变量
  2. timer线程,休眠三秒钟,然后杀死user_input线程
  3. 主线程,产生另外两个,然后等待user_input线程完成

没有timer线程,代码看起来就像单线程一样,提示用户输入然后继续.使用#join序列化两个线程的执行.主线程通过查看user_inputvalue线程变量获得用户交互的结果.

添加timer线程会导致user_input线程提前终止(在这种情况下为3秒).发生这种情况时,user_input线程没有设置其value线程变量,因此当主线程询问此变量时,它返回nil.这是主线程如何确定是否user_input因为接受来自用户的输入而被终止,或被timer线程杀死.