【问题标题】:How to force a redraw within a loop?如何在循环内强制重绘?
【发布时间】:2012-08-09 01:20:06
【问题描述】:

我在 Scala 中使用处理(尽管我认为这与我的问题并不真正相关)。

我正在一个循环中构建一个搜索树,该循环一直运行到找到有效路径为止。这可能需要几秒钟,我想在构建树时绘制树的图形表示,以便用户可以看到正在发生的事情。

我试图通过在循环中调用redraw() 来解决这个问题,但这不起作用。我猜是因为redraw() 不会强制重绘,而只会设置一个应该进行重绘的标志。

那么有没有办法强制重绘或者你通常会如何解决这样的问题?

【问题讨论】:

  • 你在画什么/在哪里?摇摆?
  • 没有。我只是覆盖了 PApplet 的draw() 方法
  • 我猜你的搜索树发生在 draw() 中,并且那里的一些循环可能会阻止动画线程的其余部分运行。在单独的线程中运行搜索树怎么样?
  • 没有。循环在 PApplet 的keyTyped 方法中运行。是的,没有调用平局,因为整个线程都被我的循环阻塞了。这就是为什么我想要像forceRedraw() 这样的东西。但由于处理中不存在第二个线程可能是下一个最佳解决方案。谢谢

标签: scala processing


【解决方案1】:

@George Profenza 的评论是正确的。处理任务都发生在动画线程上。您在 draw() 中执行的任何任务都会锁定该线程,直到它们完成。如果您想在任务执行时更新屏幕,请在单独的线程上运行任务(超出处理 API 的范围,您必须为此使用 Java),或者将任务分解为段并让绘制() 方法在每个段的末尾返回,以便 PApplet 可以呈现到屏幕上。

【讨论】:

  • 那么循环实际上是在被覆盖的keyTyped 方法中运行的。当然,我知道为什么不调用“正常”平局。这就是为什么我问是否有一种方法可以强制重绘,因为那将是最简单和最干净的解决方案。但我想这根本无法通过处理来完成。所以我想在单独的线程中运行循环将是最好的解决方案。将代码拆分成多个在draw 方法中处理的较小循环实际上是我现在使用的解决方案,但我认为这不是一个非常优雅的解决方案。
  • 它不是特别优雅,但这是在单线程程序中运行异步更新的“正常”方式。与 Flash 相同,例如bit-101.com/blog/?p=2581。但由于 Processing 是 Java,您可以分离一个单独的线程来构建您的搜索树。
  • 顺便说一句,keyTyped 方法是从 PApplet.handleDraw() 中调用的,它本质上是主循环,也就是 Processing 的 draw(),也就是 Animation Thread 的 run() 方法。所以你的搜索树构建或多或少发生在draw()中。 code.google.com/p/processing/source/browse/trunk/processing/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-05
  • 1970-01-01
  • 2018-04-26
相关资源
最近更新 更多