Estoy escribiendo una pequeña aplicación en Scala. La aplicación procesa archivos de registro simples. Debido a que el procesamiento lleva tiempo, he decidido permitir que mi aplicación extienda Actor.Interactuando con actores en aplicaciones de escalamiento de voz
class Application extends Actor {
def react() {
loop {
react {
case Process(file) => // do something interesting with file...
}
}
}
}
El procesamiento de un archivo de registro se desencadena al hacer clic en un botón de la interfaz gráfica de usuario. La GUI usa 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)
}
}
}
Ahora, el núcleo de la aplicación necesita notificar a la guía sobre el progreso actual.
sender ! Progress(value) // whenever progress is made
He resuelto esto mediante la creación de un actor independiente dentro de la GUI. El actor se ejecuta dentro del hilo edt. Escucha los mensajes del núcleo de la aplicación y actualiza la GUI.
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
}
}
}
}
}
Puesto que el núcleo aplicación necesita saber sobre el remitente del mensaje, también utilizo este actor para reenviar mensajes desde la interfaz gráfica de usuario a la base de la aplicación, por lo que mi actor del nuevo remitente.
reactions += {
case ButtonClicked(`startButton`) => actor ! ForwardToApplication(Process(file))
}
Este código funciona bien. Mi pregunta: ¿hay una manera más simple de hacer esto? Se whould sea agradable a simple uso del mecanismo de las reacciones de mis mensajes de aplicación:
reactions += {
case Progress(value) => progressBar.value = value
}
Alguna idea de cómo lograr esto?
Creo que es una buena solución. Tal vez merezco un voto a cambio;) – gerferra
Creo que te estás perdiendo 'intermediario!' En tu reacción a 'ButtonClicked' – gerferra
@geferra La llamada' intermediador! 'Está dentro del constructor de' case class Send'. El 'intermediario' se pasa a través de un parámetro implícito. Estoy votando tu respuesta, ya que me inspiró para mi propia solución. –