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

このコードでは 3 つのスレッドが実行されています。

  1. user_inputユーザーから文字列を取得し、そのスレッド変数を設定するvalueスレッド
  2. timer3 秒間スリープしてからスレッドを強制終了するuser_inputスレッド
  3. user_input他の 2 つのスレッドを生成し、スレッドの終了を待機するメイン スレッド

スレッドがなければ、timerコードは、ユーザー入力を求めて続行するシングルスレッドのコードとまったく同じように機能するように見えます。2 つのスレッドの実行は、#join を使用してシリアル化されます。user_inputメイン スレッドは、のvalueスレッド変数を参照して、ユーザー インタラクションの結果を取得します。

スレッドを追加すると、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 に答える