Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.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
clojure(添加监视)在剪贴板上进行更改时不通知_Clojure_Clipboard_Clipboard Interaction - Fatal编程技术网

clojure(添加监视)在剪贴板上进行更改时不通知

clojure(添加监视)在剪贴板上进行更改时不通知,clojure,clipboard,clipboard-interaction,Clojure,Clipboard,Clipboard Interaction,我正在用clojure编写一个小工具,想知道剪贴板上什么时候有变化。这里有一个正在发生的事情的简化版本 (:import java.awt.Toolkit) (:import (java.awt.datatransfer Clipboard ClipboardOwner Transferable Stri

我正在用clojure编写一个小工具,想知道剪贴板上什么时候有变化。这里有一个正在发生的事情的简化版本

(:import java.awt.Toolkit)

(:import (java.awt.datatransfer Clipboard
                                ClipboardOwner
                                Transferable
                                StringSelection
                                DataFlavor
                                FlavorListener))

(defn get-clipboard [] (. (Toolkit/getDefaultToolkit)
                     (getSystemClipboard)))

(defn get-content []
  (.getContents (get-clipboard) nil))


(def content (agent (get-content)))


(defn watch [key f]
 (add-watch content key f))

(defn -main []
  (while (not= content "banana-man")
    (watch :watcher
           (fn [key agent old-state new-state]
             (prn "-- agent Changed --")
             (prn "key" key)
             (prn "atom" agent)
             (prn "old-state" old-state)
             (prn "new-state" new-state)))))
我添加了一个while循环,以防止主功能立即关闭


运行时不会抛出任何错误,但不会报告剪贴板上的更改,也不会在我将bannan man复制到剪贴板时停止while循环。我已经为此挣扎了几个星期,我确信我错过了一些简单的东西。如果有人有什么建议,我会非常感激

首先,内容是一个代理,因此它永远不会等于字符串。为了进行比较,应该使用@取消代理的引用

不需要while循环来防止退出。如果使用代理线程池,Clojure将不会关闭,直到显式运行关闭代理。但我们需要它来管理您的代理更新

内容不会在初始分配后更改,除非您使用send或send off显式地向其发送更新函数。不要让名称误导您,代理不是自主的,也不是计划或重复的任务。试着这样做:

(defn -main []
  (watch :watcher
           (fn [key agent old-state new-state]
             (prn "-- agent Changed --")
             (prn "key" key)
             (prn "atom" agent)
             (prn "old-state" old-state)
             (prn "new-state" new-state)))
  (while (not= @content "banana-man")
    (send-off content (fn [& _] (get-content)))
    (Thread/sleep 250))
  (shutdown-agents))

谢谢你的时间,抱歉,我提前按了回车键。一般来说,我对clojure和编程都很陌生,所以对于我在示例中使用的低效方法,我深表歉意。谢谢你的建议!但我必须问,如果不主动发送内容,是否无法让addwatch函数返回新状态?明确地说,我的目标是让用户将文档扫描为ctrl-c文本,该文本将自动从剪贴板中提取并处理,供用户稍后查看。我觉得你的建议是最好的选择,但我只是想核实一下。再次感谢你!这并不是说它没有效率,而是它实际上什么都不会做。只有在您调用send或send off时,代理才会更改。它不是自主的。而观察者只有在代理改变时才会触发——它的自主性甚至更低。您需要在循环中重复检查剪贴板的状态。我认为显式地将该操作放入循环中更容易。