aboutsummaryrefslogtreecommitdiffstats
path: root/core/serialthread.rb
diff options
context:
space:
mode:
authortoshi <toshi@03aab468-d3d2-4883-8b12-f661bbf03fa8>2011-02-19 14:41:08 +0000
committertoshi <toshi@03aab468-d3d2-4883-8b12-f661bbf03fa8>2011-02-19 14:41:08 +0000
commit2dcd89567fd3cc81f0ce55e9780fe8e68a0f0057 (patch)
treec98a57684b4b03053752c58db4557436cd669541 /core/serialthread.rb
parent591a33897334ee5fa6ed06336607fec11f841b01 (diff)
downloadmikutter-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.rb46
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