2012-04-25 38 views
2

好的,我在Clojure有这个小的procedural SVG editorClojure代理:限速?

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

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

我还没有使用代理,我不知道他们是否使用隐式队列,但我怀疑是这样。在我的情况下,我对计算“中间”步骤没有兴趣(想想快速键击:如果在重新编译开始之前发生键击,我只想丢弃重新编译) - 即我想要一个send覆盖任何挂起代理计算。

我该如何做到这一点?任何提示?甚至是代码示例?我的散漫是否有道理?

谢谢!

回答

2

您描述了一个问题,它更多地处理执行流控制而不是共享状态管理。因此,您可能需要暂时离开STM并查看期货:它们仍作为代理程序在线程池中执行,但代理程序可以通过调用future-cancel来停止,并使用future-cancelled?检查其状态。

没有有力的保证线程未来执行can be effectively stopped。不过,您的代码将能够尝试取消未来,并继续安排下一次重新编译。

2

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

+0

难道不会在UI线程上留下计算吗? – ivant 2012-04-26 06:38:00