Concurrency 为什么其他线程看不到我的ref更新?
我正在用Swing在Clojure做一个游戏。我有一个KeyListener来处理控件,但它没有更新refConcurrency 为什么其他线程看不到我的ref更新?,concurrency,clojure,Concurrency,Clojure,我正在用Swing在Clojure做一个游戏。我有一个KeyListener来处理控件,但它没有更新ref (def move (ref :drop)) (defn get-move [block state x y moves] (do (println @move) (if (check-move @move x y block state) @move :nothing))) (defn listener [keyevent] (let
(def move (ref :drop))
(defn get-move
[block state x y moves]
(do (println @move)
(if (check-move @move x y block state) @move
:nothing)))
(defn listener
[keyevent]
(let [c (.getKeyChar keyevent)]
(do (println c)
(cond (= c "j") (dosync (ref-set move :left))
(= c "l") (dosync (ref-set move :right))
(= c "i") (dosync (ref-set move :rotate))
(= c "k") (dosync (ref-set move :drop))))))
(defn make-keylistener
[]
(proxy [KeyAdapter] []
(keyPressed [event]
(listener event))))
现在,我们的想法是更新gui的主函数调用get move。它检查move ref在游戏中是否有效,如果有效,则返回它。侦听器连接到JPanel,并根据按键更改ref。监听器工作正常——只要按下一个按钮,它就会打印出按键字符。我只能假设它正在更改ref。然而,get move总是返回相同的值-它从未看到@move change。我觉得我误解了Clojure中并发和状态的一些基本概念。我做错了什么?有没有更实用的方法来处理这个问题
谢谢
编辑:如果我使用原子,同样的问题也会发生。这不是并发问题。getKeyChar返回一个char,我将其与字符串进行比较。将条件重写为(=(str c)“j”)可以使其工作。这不是并发问题。getKeyChar返回一个char,我将其与字符串进行比较。将条件重写为(=(str c)“j”)可以使其工作。因此,如果要与字符进行比较,只需编写:
(=c\j)
\表示字符?很高兴知道,我还没有遇到这个问题。因此,如果您要与字符进行比较,您可以简单地编写:(=c\j)
\表示字符?很高兴知道,我还没有遇到过。