diff options
author | toshi <toshi@03aab468-d3d2-4883-8b12-f661bbf03fa8> | 2011-02-19 14:41:08 +0000 |
---|---|---|
committer | toshi <toshi@03aab468-d3d2-4883-8b12-f661bbf03fa8> | 2011-02-19 14:41:08 +0000 |
commit | 2dcd89567fd3cc81f0ce55e9780fe8e68a0f0057 (patch) | |
tree | c98a57684b4b03053752c58db4557436cd669541 /core/serialthread.rb | |
parent | 591a33897334ee5fa6ed06336607fec11f841b01 (diff) | |
download | mikutter-2dcd89567fd3cc81f0ce55e9780fe8e68a0f0057.tar.gz |
つぶやきがキューに複数溜まってる場合、それら全てをまとめて一つのイベントで処理する closes 83
同じイベントが1秒間に2件以上発生しないようにする closes 83
git-svn-id: svn://toshia.dip.jp/mikutter/trunk@246 03aab468-d3d2-4883-8b12-f661bbf03fa8
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 |