2

好的,所以我在 Clojure 中有这个小的程序 SVG 编辑器。

它有一个代码窗格,用户可以在其中创建生成 SVG 文档的代码,以及一个预览窗格。每当代码更改时,预览窗格都会更新。

现在,在文本更改事件中,代码在 UI 线程(Ewwwww!)上重新编译,并且预览窗格更新。编译步骤应该是异步进行的,代理似乎是解决这个问题的好方法:要求代理在更新时重新编译代码,并将结果传递给图像窗格。

我还没有使用代理,我不知道它们是否与隐式队列一起使用,但我怀疑是这样。就我而言,我对计算“中间”步骤的兴趣为零(想想快速击键:如果击键发生在重新编译开始之前,我只想放弃重新编译)——即我想要send覆盖任何待处理的代理计算。

我该如何做到这一点?有什么提示吗?甚至是代码示例?我的胡言乱语还有意义吗?

谢谢!

4

2 回答 2

2

代理确实在队列上工作,因此每个函数都获取代理的状态并产生代理的下一个状态。代理随着时间的推移跟踪身份。这听起来比你需要的多一点,原子更适合你的任务,并且以非常相似的方式使用。

于 2012-04-25T20:44:39.077 回答
2

您描述了一个更多地处理执行流控制而不是共享状态管理的问题。因此,您可能希望暂时将 STM 分开,并研究一下future:它们仍然作为代理在线程池中执行,但可以通过调用而不是代理来停止它们future-cancel,并使用 检查它们的状态future-cancelled?

没有强有力的保证未来正在执行的线程可以有效地停止。尽管如此,您的代码将能够尝试取消未来,并继续安排下一次重新编译。

于 2012-04-25T21:06:53.280 回答