3

我想在 Ruby 中制作一个计时器,在用户选择一定时间后,计时器响起或弹出一条消息。此外,是否可以让计时器响起,直到用户做了某件事(例如数学问题)?

4

3 回答 3

6

使用线程:

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

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

  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线程杀死。

于 2013-01-10T17:03:00.753 回答
1

有人这样想?

puts "In how many Seconds you want me to beep?"
t = gets.to_i

sleep t
puts "\a WAKE UP!"
于 2013-01-10T08:05:29.843 回答
1

我的方式 :

comt = 0
while (comt < 10)
    sleep(1)
    comt = comt +1
    puts comt
end#while

那个显示:1 2 3 ... 10

于 2017-11-26T12:16:07.333 回答