Я пишу небольшое приложение в Scala.Приложение обрабатывает простые файлы журнала.Поскольку обработка занимает некоторое время, я решил позволить ядру моего приложения расширить Actor.
class Application extends Actor {
def react() {
loop {
react {
case Process(file) => // do something interesting with file...
}
}
}
}
Обработка файла журнала запускается нажатием кнопки в графическом интерфейсе.Gui использует Scala Swing.
object Gui extends SimpleSwingApplication {
val application = new Application().start()
def top = new MainFrame {
val startButton = new Button
reactions += {
case ButtonClicked(`startButton`) => application ! Process(file)
}
}
}
Теперь ядро приложения должно уведомлять графический интерфейс о текущем прогрессе.
sender ! Progress(value) // whenever progress is made
Я решил это, создав отдельного актера внутри графического интерфейса.Актер исполняется внутри потока edt.Он слушает сообщения из ядра приложения и обновляет графический интерфейс.
object Gui extends SimpleSwingApplication {
val actor = new Actor {
override val scheduler = new SchedulerAdapter {
def execute(fun: => Unit) { Swing.onEDT(fun) }
}
start()
def act() {
loop {
react {
case ForwardToApplication(message) => application ! message
case Progress(value) => progressBar.value = value
}
}
}
}
}
Поскольку ядру приложения необходимо знать об отправителе сообщения, я также использую этот субъект для пересылки сообщений из графического интерфейса в ядро приложения, что делает моего субъекта новым отправителем.1014 *
Этот код работает просто отлично.Мой вопрос: есть ли более простой способ сделать это?Было бы неплохо просто использовать механизм реакций для сообщений моего приложения:
reactions += {
case Progress(value) => progressBar.value = value
}
Есть идеи, как этого добиться?