我正在嘗試處理重複事件(重複三次的MIDI音符和音符信號)。這似乎是使用代理和鎖定工作,除非事件同時發生(幾乎)。在Clojure中處理同時發生的重複事件
下面是一個例子:
(def test-val (agent 0))
(def allow-update (agent true))
(defn increase-val []
(locking allow-update
(when @allow-update
(send allow-update (fn [_ x] x) false)
(send test-val + 1)))
(print @test-val))
(defn run-futures [delay-time]
(send allow-update (fn [_ x] x) true)
(send test-val * 0)
(dotimes [_ 20]
(Thread/sleep delay-time)
(future (increase-val))))
如果我與電話之間有輕微的延遲,增加-VAL測試:
(run-futures 2)
;outputs 0111111111111111111 every time, as expected
但是如果我讓所有的呼叫,以增加-VAL發生的所有一次:
(run-futures 0)
;001222222222222222
(run-futures 0)
;000000145555555555
(run-futures 0)
;000000013677777777
好像鎖沒有時間去開啓,因此代理得到提高由多個期貨。
我希望我在這裏失蹤的東西,讓我確保我不想重複同時發生的事件採取行動。
謝謝!
你能否包含test-val的定義?我假設它是一個代理? –
哎呦,修正了那個。 – crimper