diff options
Diffstat (limited to 'core/serialthread.rb')
-rw-r--r-- | core/serialthread.rb | 46 |
1 files changed, 25 insertions, 21 deletions
diff --git a/core/serialthread.rb b/core/serialthread.rb index 0d5bbf43..9dfec2bf 100644 --- a/core/serialthread.rb +++ b/core/serialthread.rb @@ -6,25 +6,16 @@ miquire :core, 'delayer' require 'thread' # コンストラクタにブロックを与えると別スレッドでそれを実行するが、 -# 別々のSerialThread同士は同じスレッドで実行される +# 別々のSerialThread同士は同じスレッドで実行される(複数のSerialThreadは同時に実行されない) class SerialThread - @@wait_queue = Queue.new - @@rapid_queue = Queue.new + @wait_queue = Queue.new + @rapid_queue = Queue.new + @lock = Mutex.new - def self.new_thread(queue, wait_finish_delayer) - Thread.new do - begin - while proc = queue.pop - proc.call - if(wait_finish_delayer) - while not(Delayer.empty?) - sleep(0.1) end end end - rescue Object => e - error e - abort end end end - - new_thread(@@wait_queue, true) - new_thread(@@rapid_queue, false) + # SerialThreadの中でブロックを実行する。 + def self.new(wait_finish_delayer = true) + (wait_finish_delayer ? @wait_queue : @rapid_queue).push(Proc.new) + nil end # SerialThread.new(false) と同じ def self.rapid @@ -34,7 +25,20 @@ class SerialThread def self.lator self.new(true, &Proc.new) end - # SerialThreadの - def self.new(wait_finish_delayer = true) - (wait_finish_delayer ? @@wait_queue : @@rapid_queue).push(Proc.new) - nil end end + def self.busy? + @lock.locked? end + + def self.new_thread(queue, wait_finish_delayer) + Thread.new do + begin + while proc = queue.pop + @lock.synchronize{ proc.call } + sleep(0.1) while Delayer.busy? if wait_finish_delayer end + rescue Object => e + error e + abort end end end + + new_thread(@wait_queue, true) + new_thread(@rapid_queue, false) + +end |