Как объединить или пропустить повторяющиеся сообщения в Scala Actor? - PullRequest
5 голосов
/ 02 мая 2011

Допустим, у вас есть компонент графического интерфейса, и все 10 потоков сообщают ему о необходимости перекрасить в то же время, что и все они приходят до того, как произойдет одна операция рисования.Вместо того чтобы наивно тратить ресурсы на перерисовку 10 раз, просто объедините / проигнорируйте все, кроме последнего, и перекрасьте один раз (или, скорее, дважды - один раз для первого и один раз для последнего).Насколько я понимаю, менеджер перерисовки Swing делает это.

Есть ли способ выполнить такой же тип поведения в Scala Actor?Есть ли способ просмотреть очередь и объединить сообщения или игнорировать все, кроме последнего, определенного типа или чего-то еще?

1 Ответ

4 голосов
/ 02 мая 2011

Что-то вроде этого?:

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

Если вы хотите перекрашивать всякий раз, когда у потока актера появляется шанс, но не более, тогда: (UPDATE: перерисовка с использованием аргументов последнего сообщения)

act =
  loop {
    react {
      case r@Repaint(_, _) =>  
        var lastMsg = r
        def findLast: Unit = {
          reactWithin(0) {
            case r@Repaint(_, _) => 
              lastMsg = r
            case TIMEOUT => repaint(lastMsg.a, lastMsg.b)
          }
        }
        findLast
    }
  }
...