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
メソッドを使用して、さまざまな先物を組み合わせることができます。それらが呼び出されると、UI で進行状況を更新できます (常にブロックFuture
で行うようにしてください)。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 の例は時代遅れに見えますが、良いアイデアが得られるはずです)