2011-05-02 13 views
5

Digamos que tiene un componente gui y 10 hilos indican que debe volver a pintar al mismo tiempo que todos antes de que se realice una sola operación de pintura. En lugar de desperdiciar ingenuamente recursos repintando 10 veces, simplemente combine/ignore todo menos el último y vuelva a pintar una vez (o más probablemente, dos veces, una para la primera y otra para la última). Tengo entendido que el gerente de repintado Swing hace esto.Cómo combinar u omitir mensajes duplicados en un Scala Actor?

¿Hay alguna manera de lograr este mismo tipo de comportamiento en un actor de Scala? ¿Hay alguna manera de mirar la cola y fusionar mensajes, o ignorar todo menos el último de cierto tipo o algo?

+0

Definir "último mensaje" –

Respuesta

4

Algo como esto ?:

act = 
    loop { 
    react { 
     case Repaint(a, b) => if (lastRepaint + minInterval < System.currentTimeMillis) { 
      lastRepaint = System.currentTimeMillis 
      repaint(a, b) 
    } 
    } 

Si desea volver a pintar siempre hilo del actor tiene la oportunidad, pero no más, entonces: (ACTUALIZACIÓN: repintar usando los últimos argumentos del mensaje)

act = 
    loop { 
    react { 
     case [email protected](_, _) => 
     var lastMsg = r 
     def findLast: Unit = { 
      reactWithin(0) { 
      case [email protected](_, _) => 
       lastMsg = r 
      case TIMEOUT => repaint(lastMsg.a, lastMsg.b) 
      } 
     } 
     findLast 
    } 
    } 
+0

No creo que esto haga lo que se necesita. Debe esperar hasta el "último" mensaje de repintado antes de ejecutar el repintado, ya que los otros eventos no repintados en la cola pueden causar cambios que luego requieren un repintado después de ellos. Pero en su ejemplo superior, el último evento podría estar dentro del período de tiempo y, por lo tanto, se ignorará, pero es posible que hayamos hecho cambios entre los eventos de repintado, por lo que ahora no estamos actualizados. – mentics

+0

Actualicé mi respuesta. Si desea tratar los eventos entre repintes, agregue su manejo al bloque reactionWithin. – IttayD

+0

Excelente. Con ese patrón uno puede ir a agarrar todos los artículos en la cola y hacer todas las operaciones en todos juntos. – mentics

Cuestiones relacionadas