对于 Scala 2.10
您可以使用scala.concurrent.future
然后在完成时注册一个回调。回调将更新 EDT 线程上的 GUI。
我们开始做吧!
//in your swing gui event listener (e.g. button clicked, combo selected, ...)
import scala.concurrent.future
//needed to execute futures on a default implicit context
import scala.concurrent.ExecutionContext.Implicits._
val backgroundOperation: Future[Result] = future {
//... do that thing, on another thread
theResult
}
//this goes on without blocking
backgroundOperation onSuccess {
case result => Swing.onEDT {
//do your GUI update here
}
}
这是最简单的情况:
- 我们只在完成后更新,没有任何进展
- 我们只处理成功的案例
为了处理(1),您可以使用实例上的map
/flatMap
方法组合不同的期货。Future
当这些被调用时,您可以更新 UI 中的进度(始终确保您在一个Swing.onEDT
块中进行
//example progress update
val backgroundCombination = backgroundOperation map { partial: Result =>
progress(2)
//process the partial result and obtain
myResult2
} //here you can map again and again
def progress(step: Int) {
Swing.onEDT {
//do your GUI progress update here
}
}
要处理 (2),您可以注册回调onFailure
或使用onComplete
.
相关示例:scaladocs和相关SIP(虽然 SIP 示例似乎已经过时,但它们应该给你一个好主意)