我编写了一个我想通过UI(也在Swing中)触发的Scala程序。问题是,当我触发它时,UI挂起直到后台程序完成。我不得不考虑解决这个问题的唯一方法是让程序在另一个线程/ actor中运行,并在需要时更新UI。更新将包括一个状态栏,它将显示当前正在处理的文件和一个进度条。使用Swing进行异步UI更新
由于Scala演员已被弃用,我正在试图通过Akka来获取某种基本多线程运行的艰难时间。阿卡网站上的例子也很复杂。
但更重要的是,我发现很难围绕如何解决这个问题。我能想出是:
- 后台程序运行作为一个演员
- UI是主程序
- 有另一个演员,告诉UI更新的东西
第3步什么让我混淆。如何在不锁定某个变量的情况下告诉UI?
此外,我相信这个问题已经解决了。任何示例代码相同将不胜感激。
=======================
编辑:用什么演员的工作对我来说
相反,我使用了类似的期货的方式pagoda_5b在他的回答解释说:
移动状态栏和进度条出def top
,使他们的全局变量:
object MyGUIProject extends SimpleSwingApplication {
val txtStatus = new Label //Global
val progressBar = new ProgressBar //Global
def top = new MainFrame {
...
}
}
通话时,我CL未来的后台进程ICK按钮:
def updateStatus(txt: String) = {
val fut = future {
Swing.onEDT {
txtStatus.text = txt
}
}
}
def doLongBackgroundProcess(str:String) = {
val taskList = getTasks(str)
taskList foreach {x=>
updateStatus("Currently doing task: " + x)
//Start doing it
}
}
要从用户界面启动Scala程序,请确保您的程序不在EDT上运行。 'SwingWorker'可以减轻这个问题的工作量,或者你可以使用'Executors'。查看“Swing中的并发”:http://stackoverflow.com/tags/swing/info – 2013-03-04 14:28:19
高度相关http://stackoverflow.com/questions/13516752/using-opengl-with-akka-actors-guaranteeing-a-单线程用于指定 – 2013-03-04 14:29:18
请参见[如何使用SwingWorker工作](http://stackoverflow.com/a/11546203/597657)。 – 2013-03-04 15:07:00