Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Concurrency 为什么其他线程看不到我的ref更新?_Concurrency_Clojure - Fatal编程技术网

Concurrency 为什么其他线程看不到我的ref更新?

Concurrency 为什么其他线程看不到我的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

我正在用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 [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)
\表示字符?很高兴知道,我还没有遇到过。