質問するログイン新規登録

質問編集履歴

2

操作を誤ったため元に戻しました。

2017/10/02 10:14

投稿

roswell
roswell

スコア17

title CHANGED
File without changes
body CHANGED
@@ -1,71 +1,56 @@
1
+ yama@roswell:~$ uname -a
2
+ CYGWIN_NT-6.3 JPC20165182 2.6.0(0.304/5/3) 2016-08-31 14:32 x86_64 Cygwin
3
+ yama@roswell:~$ ruby --version ruby 2.2.5p319 (2016-04-26 revision 54774) [x86_64-cygwin]
4
+ の環境で、
5
+
6
+ 2つのthread
7
+ input_thread,exec_thread
8
+ を用いて、
9
+
10
+ input_threadにて、標準入力より p がタイプされると、
1
- otn さんのアドバイス参考に、Queue thread.push, thread.pop を用いることで、何とか実現できま
11
+ exec_thread を thread.sleep で、sleep状態にています
12
+ (下記コードの (*1) の部分)
13
+
14
+ exec_thread 内で、sleepコールで、既にsleep状態になっている場合
15
+ (下記コードの(*2)の部分)
16
+ sleepコールで、指定した時間が来れば、run状態になりますが...
17
+
18
+ exec_threadそのものの動きを止めたい、すなわちsleepコールの動きのそのもの
19
+ を止めたい場合は、
20
+ どうすればよいのかご教示いただけますでしょうか?
21
+
22
+ 簡単に説明すると、
23
+ input_thread で、標準入力より p がタイプされると、exec_thread を停止。
24
+ また、p がタイプされると、exec_thread 再開。
25
+ 但し、exec_thread 再開後は、停止した際から、sleep設定時間の残り時間を
26
+ exec_threadは実行というような感じにしたいのです。
2
27
 
3
- 以下、コードのsampleになります。
4
-
5
28
  ```
6
- q = Queue.new
7
-
8
29
  exec_thread = Thread.new do
30
+ loop do
9
- puts "in exec_thread"
31
+ puts "in exec_thread"
10
-
11
- ets = :run # ets: exec thread status
12
-
13
- loop do
14
-
15
- n = 30 # sleep specified secs
32
+ n = 30 # sleep specified secs
16
- puts "in exec_thread sleep start #{n}s"
33
+ puts "in exec_thread sleep start #{n}s"
17
-
18
- loop do
19
- begin
20
- etc = q.pop(non_block = true) # etc : exec thread control
21
-
22
- case ets
23
- when :run
24
- if etc == :stop
34
+ sleep(n) # (*2)
25
- puts "in exec_thread goes to sleep stop mode"
35
+ puts "in exec_thread sleep end"
26
- ets = :stop
27
- end
36
+ end
28
- when :stop
29
- if etc == :run
30
- puts "in exec_thread goes to sleep run mode"
31
- ets = :run
32
- end
37
+ end
33
- end
38
+
34
- rescue => e
35
- case ets
36
- when :run
37
- puts "sleep count down #{n}"
38
- sleep(1)
39
- n -= 1
40
- break if n < 0
41
- when :stop
42
- else # do nothing
43
- end
44
- end
45
- end
46
- end
47
- end
48
-
49
39
  input_thread = Thread.new do
40
+ loop do
41
+ ret = STDIN.gets
42
+
43
+ case ret
44
+ when /^ *q *$/
45
+ puts "get q"
46
+ exit
47
+ when /^ *p *$/
50
- ets = :run # ets: execute thread status
48
+ puts "get p" # (*1)
49
+ exec_thread.stop
50
+ end
51
+ end
52
+ end
51
53
 
52
- loop do
53
- ret = STDIN.gets
54
-
55
- case ret
56
- when /^ *q *$/
57
- puts "get q"
58
- exit
59
- when /^ *p *$/
60
- puts "get p"
61
- if ets == :run
54
+ exec_thread.join
62
- ets = :stop
63
- q.push(:stop)
55
+ input_thread.join
64
- else
65
- ets = :run
66
- q.push(:run)
67
- end
68
- end
69
- end
70
- end
71
56
  ```

1

Queue と thread.push, thread.pop を用いることで、何とか実現できました。

2017/10/02 10:14

投稿

roswell
roswell

スコア17

title CHANGED
File without changes
body CHANGED
@@ -1,45 +1,54 @@
1
- yama@roswell:~$ uname -a
2
- CYGWIN_NT-6.3 JPC20165182 2.6.0(0.304/5/3) 2016-08-31 14:32 x86_64 Cygwin
3
- yama@roswell:~$ ruby --version ruby 2.2.5p319 (2016-04-26 revision 54774) [x86_64-cygwin]
1
+ otn さんのアドバイスを参考に、Queue thread.push, thread.pop を用いることで、何とか実現できました。
4
2
 
5
- の環境で
3
+ 以下コードのsampleになります。
6
4
 
5
+ ```
7
- 2つのthread
6
+ q = Queue.new
8
- input_thread,exec_thread
9
- を用いて、
10
7
 
11
- input_threadにて、標準入力より p がタイプされると、
12
- exec_thread thread.sleep で、sleep状態にしています。
8
+ exec_thread = Thread.new do
13
- (下記コードの (*1) の部分)
9
+ puts "in exec_thread"
14
10
 
15
- exec_thread 内で、sleepコールで、既にsleep状態になっている場合
11
+ ets = :run # ets: exec thread status
16
- (下記コードの(*2)の部分)
17
- sleepコールで、指定した時間が来れば、run状態になりますが...
18
12
 
19
- exec_threadそのものの動きを止めたい、すなわちsleepコールの動きのそのもの
20
- を止めたい場合は、
21
- どうすればよいのかご教示いただけますでしょうか?
22
-
23
- 簡単に説明すると、
24
- input_thread で、標準入力より p がタイプされると、exec_thread を停止。
25
- また、p がタイプされると、exec_thread 再開。
26
- 但し、exec_thread 再開後は、停止した際から、sleep設定時間の残り時間を
27
- exec_threadは実行というような感じにしたいのです。
28
-
29
- ```
30
- exec_thread = Thread.new do
31
13
  loop do
32
- puts "in exec_thread"
33
14
 
34
15
  n = 30 # sleep specified secs
35
16
  puts "in exec_thread sleep start #{n}s"
36
- sleep(n) # (*2)
37
17
 
18
+ loop do
19
+ begin
20
+ etc = q.pop(non_block = true) # etc : exec thread control
21
+
22
+ case ets
23
+ when :run
24
+ if etc == :stop
25
+ puts "in exec_thread goes to sleep stop mode"
26
+ ets = :stop
27
+ end
28
+ when :stop
29
+ if etc == :run
38
- puts "in exec_thread sleep end"
30
+ puts "in exec_thread goes to sleep run mode"
31
+ ets = :run
32
+ end
33
+ end
34
+ rescue => e
35
+ case ets
36
+ when :run
37
+ puts "sleep count down #{n}"
38
+ sleep(1)
39
+ n -= 1
40
+ break if n < 0
41
+ when :stop
42
+ else # do nothing
43
+ end
44
+ end
45
+ end
39
46
  end
40
47
  end
41
48
 
42
49
  input_thread = Thread.new do
50
+ ets = :run # ets: execute thread status
51
+
43
52
  loop do
44
53
  ret = STDIN.gets
45
54
 
@@ -48,12 +57,15 @@
48
57
  puts "get q"
49
58
  exit
50
59
  when /^ *p *$/
51
- puts "get p" # (*1)
60
+ puts "get p"
61
+ if ets == :run
52
- exec_thread.stop
62
+ ets = :stop
63
+ q.push(:stop)
64
+ else
65
+ ets = :run
66
+ q.push(:run)
67
+ end
53
68
  end
54
69
  end
55
70
  end
56
-
57
- exec_thread.join
58
- input_thread.join
59
71
  ```