質問編集履歴

2

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

2017/10/02 10:14

投稿

roswell
roswell

スコア17

test CHANGED
File without changes
test CHANGED
@@ -1,141 +1,111 @@
1
- otn さんのアドバイスを参考に、Queue と thread.push, thread.pop を用いることで、何とか実現できました。
1
+ yama@roswell:~$ uname -a
2
2
 
3
+ CYGWIN_NT-6.3 JPC20165182 2.6.0(0.304/5/3) 2016-08-31 14:32 x86_64 Cygwin
3
4
 
5
+ yama@roswell:~$ ruby --version ruby 2.2.5p319 (2016-04-26 revision 54774) [x86_64-cygwin]
4
6
 
7
+ の環境で、
8
+
9
+
10
+
11
+ 2つのthread
12
+
13
+ input_thread,exec_thread
14
+
15
+ を用いて、
16
+
17
+
18
+
19
+ input_threadにて、標準入力より p がタイプされると、
20
+
21
+ exec_thread を thread.sleep で、sleep状態にしています。
22
+
5
- コードのsampleになります。
23
+ (コードの (*1) の部分)
24
+
25
+
26
+
27
+ exec_thread 内で、sleepコールで、既にsleep状態になっている場合
28
+
29
+ (下記コードの(*2)の部分)
30
+
31
+ sleepコールで、指定した時間が来れば、run状態になりますが...
32
+
33
+
34
+
35
+ exec_threadそのものの動きを止めたい、すなわちsleepコールの動きのそのもの
36
+
37
+ を止めたい場合は、
38
+
39
+ どうすればよいのかご教示いただけますでしょうか?
40
+
41
+
42
+
43
+ 簡単に説明すると、
44
+
45
+ input_thread で、標準入力より p がタイプされると、exec_thread を停止。
46
+
47
+ また、p がタイプされると、exec_thread 再開。
48
+
49
+ 但し、exec_thread 再開後は、停止した際から、sleep設定時間の残り時間を
50
+
51
+ exec_threadは実行というような感じにしたいのです。
6
52
 
7
53
 
8
54
 
9
55
  ```
10
56
 
57
+ exec_thread = Thread.new do
58
+
59
+ loop do
60
+
61
+ puts "in exec_thread"
62
+
63
+ n = 30 # sleep specified secs
64
+
65
+ puts "in exec_thread sleep start #{n}s"
66
+
67
+ sleep(n) # (*2)
68
+
69
+ puts "in exec_thread sleep end"
70
+
71
+ end
72
+
73
+ end
74
+
75
+
76
+
77
+ input_thread = Thread.new do
78
+
79
+ loop do
80
+
11
- q = Queue.new
81
+ ret = STDIN.gets
82
+
83
+
84
+
85
+ case ret
86
+
87
+ when /^ *q *$/
88
+
89
+ puts "get q"
90
+
91
+ exit
92
+
93
+ when /^ *p *$/
94
+
95
+ puts "get p" # (*1)
96
+
97
+ exec_thread.stop
98
+
99
+ end
100
+
101
+ end
102
+
103
+ end
12
104
 
13
105
 
14
106
 
15
- exec_thread = Thread.new do
107
+ exec_thread.join
16
108
 
17
- puts "in exec_thread"
18
-
19
-
20
-
21
- ets = :run # ets: exec thread status
22
-
23
-
24
-
25
- loop do
26
-
27
-
28
-
29
- n = 30 # sleep specified secs
30
-
31
- puts "in exec_thread sleep start #{n}s"
32
-
33
-
34
-
35
- loop do
36
-
37
- begin
38
-
39
- etc = q.pop(non_block = true) # etc : exec thread control
40
-
41
-
42
-
43
- case ets
44
-
45
- when :run
46
-
47
- if etc == :stop
48
-
49
- puts "in exec_thread goes to sleep stop mode"
50
-
51
- ets = :stop
52
-
53
- end
54
-
55
- when :stop
56
-
57
- if etc == :run
58
-
59
- puts "in exec_thread goes to sleep run mode"
60
-
61
- ets = :run
62
-
63
- end
64
-
65
- end
66
-
67
- rescue => e
68
-
69
- case ets
70
-
71
- when :run
72
-
73
- puts "sleep count down #{n}"
74
-
75
- sleep(1)
76
-
77
- n -= 1
78
-
79
- break if n < 0
80
-
81
- when :stop
82
-
83
- else # do nothing
84
-
85
- end
86
-
87
- end
88
-
89
- end
90
-
91
- end
92
-
93
- end
94
-
95
-
96
-
97
- input_thread = Thread.new do
109
+ input_thread.join
98
-
99
- ets = :run # ets: execute thread status
100
-
101
-
102
-
103
- loop do
104
-
105
- ret = STDIN.gets
106
-
107
-
108
-
109
- case ret
110
-
111
- when /^ *q *$/
112
-
113
- puts "get q"
114
-
115
- exit
116
-
117
- when /^ *p *$/
118
-
119
- puts "get p"
120
-
121
- if ets == :run
122
-
123
- ets = :stop
124
-
125
- q.push(:stop)
126
-
127
- else
128
-
129
- ets = :run
130
-
131
- q.push(:run)
132
-
133
- end
134
-
135
- end
136
-
137
- end
138
-
139
- end
140
110
 
141
111
  ```

1

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

2017/10/02 10:14

投稿

roswell
roswell

スコア17

test CHANGED
File without changes
test CHANGED
@@ -1,66 +1,28 @@
1
- yama@roswell:~$ uname -a
2
-
3
- CYGWIN_NT-6.3 JPC20165182 2.6.0(0.304/5/3) 2016-08-31 14:32 x86_64 Cygwin
4
-
5
- yama@roswell:~$ ruby --version ruby 2.2.5p319 (2016-04-26 revision 54774) [x86_64-cygwin]
1
+ otn さんのアドバイスを参考に、Queue と thread.push, thread.pop を用いることで、何とか実現できました。
6
2
 
7
3
 
8
4
 
9
- の環境で、
10
-
11
-
12
-
13
- 2つのthread
14
-
15
- input_thread,exec_thread
16
-
17
- を用いて、
18
-
19
-
20
-
21
- input_threadにて、標準入力より p がタイプされると、
22
-
23
- exec_thread を thread.sleep で、sleep状態にしています。
24
-
25
- (コードの (*1) の部分)
5
+ コードのsampleになります。
26
-
27
-
28
-
29
- exec_thread 内で、sleepコールで、既にsleep状態になっている場合
30
-
31
- (下記コードの(*2)の部分)
32
-
33
- sleepコールで、指定した時間が来れば、run状態になりますが...
34
-
35
-
36
-
37
- exec_threadそのものの動きを止めたい、すなわちsleepコールの動きのそのもの
38
-
39
- を止めたい場合は、
40
-
41
- どうすればよいのかご教示いただけますでしょうか?
42
-
43
-
44
-
45
- 簡単に説明すると、
46
-
47
- input_thread で、標準入力より p がタイプされると、exec_thread を停止。
48
-
49
- また、p がタイプされると、exec_thread 再開。
50
-
51
- 但し、exec_thread 再開後は、停止した際から、sleep設定時間の残り時間を
52
-
53
- exec_threadは実行というような感じにしたいのです。
54
6
 
55
7
 
56
8
 
57
9
  ```
58
10
 
11
+ q = Queue.new
12
+
13
+
14
+
59
15
  exec_thread = Thread.new do
60
16
 
17
+ puts "in exec_thread"
18
+
19
+
20
+
21
+ ets = :run # ets: exec thread status
22
+
23
+
24
+
61
25
  loop do
62
-
63
- puts "in exec_thread"
64
26
 
65
27
 
66
28
 
@@ -68,11 +30,63 @@
68
30
 
69
31
  puts "in exec_thread sleep start #{n}s"
70
32
 
33
+
34
+
71
- sleep(n) # (*2)
35
+ loop do
36
+
37
+ begin
38
+
39
+ etc = q.pop(non_block = true) # etc : exec thread control
72
40
 
73
41
 
74
42
 
43
+ case ets
44
+
45
+ when :run
46
+
47
+ if etc == :stop
48
+
49
+ puts "in exec_thread goes to sleep stop mode"
50
+
51
+ ets = :stop
52
+
53
+ end
54
+
55
+ when :stop
56
+
57
+ if etc == :run
58
+
75
- puts "in exec_thread sleep end"
59
+ puts "in exec_thread goes to sleep run mode"
60
+
61
+ ets = :run
62
+
63
+ end
64
+
65
+ end
66
+
67
+ rescue => e
68
+
69
+ case ets
70
+
71
+ when :run
72
+
73
+ puts "sleep count down #{n}"
74
+
75
+ sleep(1)
76
+
77
+ n -= 1
78
+
79
+ break if n < 0
80
+
81
+ when :stop
82
+
83
+ else # do nothing
84
+
85
+ end
86
+
87
+ end
88
+
89
+ end
76
90
 
77
91
  end
78
92
 
@@ -81,6 +95,10 @@
81
95
 
82
96
 
83
97
  input_thread = Thread.new do
98
+
99
+ ets = :run # ets: execute thread status
100
+
101
+
84
102
 
85
103
  loop do
86
104
 
@@ -98,9 +116,21 @@
98
116
 
99
117
  when /^ *p *$/
100
118
 
101
- puts "get p" # (*1)
119
+ puts "get p"
102
120
 
121
+ if ets == :run
122
+
103
- exec_thread.stop
123
+ ets = :stop
124
+
125
+ q.push(:stop)
126
+
127
+ else
128
+
129
+ ets = :run
130
+
131
+ q.push(:run)
132
+
133
+ end
104
134
 
105
135
  end
106
136
 
@@ -108,10 +138,4 @@
108
138
 
109
139
  end
110
140
 
111
-
112
-
113
- exec_thread.join
114
-
115
- input_thread.join
116
-
117
141
  ```