[ruby-list:50591] Re: [質問]thread内sleepコール 他threadよりsleep状態からrun状態にされた際、指定時間sleepさせるには?

From: <yamataka@...08.itscom.net>
Date: 2017-09-29 10:38:38 UTC
List: ruby-list #50591
山口と申します。

質問内容と質問の仕方がが良くなかったような気がするので、
再度質問し直しさせていただきます。

yama@roswell:~$ uname -a
CYGWIN_NT-6.3 JPC20165182 2.6.0(0.304/5/3) 2016-08-31 14:32 x86_64 
Cygwin yama@roswell:~$ ruby --version ruby 2.2.5p319 (2016-04-26 
revision 54774) [x86_64-cygwin]

の環境です。

2つのthread
input_thread,exec_thread
を用いて、

input_threadにて、標準入力より p がタイプされると、
exec_thread を thread.sleep で、sleep状態にしています。
(下記コードの (*1) の部分)

exec_thread 内で、sleepコールで、既にsleep状態になっている場合 
(下記コードの(*2)の部分)
sleepコールで、指定した時間が来れば、run状態になりますが...

exec_threadそのものの動きを止めたい、すなわちsleepコールの動きのそのもの
を止めたい場合は、
どうすればよいのかご教示いただけますでしょうか?

簡単に説明すると、
input_thread で、標準入力より p がタイプされると、exec_thread を停止。
また、p がタイプされると、exec_thread 再開。
但し、exec_thread 再開後は、停止した際から、sleep設定時間の残り時間を
exec_threadは実行というような感じにしたいのです。

以下、サンプルコード
exec_thread = Thread.new do
  loop do
    puts "in exec_thread"

    n = 30 # sleep specified secs
    puts "in exec_thread sleep start #{n}s"
    sleep(n) # (*2)

    puts "in exec_thread sleep end"
  end
end

input_thread = Thread.new do
  loop do
    ret = STDIN.gets

    case ret
    when /^ *q *$/
      puts "get q"
      exit
    when /^ *p *$/    
      puts "get p" # (*1)
      exec_thread.stop
    end
  end
end

exec_thread.join
input_thread.join



In This Thread

Prev Next