Отменить все сообщения, кроме последнего в актере Scala - PullRequest
1 голос
/ 06 октября 2011

У меня есть SwingWorker актер, который вычисляет график для отображения из объекта параметров, который он отправляет;затем рисует график на нити EDT.Некоторые элементы GUI могут настраивать параметры для этого графика.Когда они меняются, я генерирую новый объект параметров и отправляю его работнику.

Пока это работает.

Теперь при перемещении ползунка многие события создаются и помещаются в очередь в почтовом ящике работника.Но мне нужно только рассчитать график для самого последнего набора параметров.Есть ли способ отбросить все сообщения из почтового ящика;сохранить последний и обработать только это?

В настоящее время код выглядит следующим образом

val worker = new SwingWorker {
  def act() {
    while (true) {
      receive {
        case params: ExperimentParameters => {
          //somehow expensive
          val result = RunExperiments.generateExperimentData(params)

          Swing.onEDT{ GuiElement.redrawWith(result) }
        }
      }
    }
  }
}

Ответы [ 2 ]

2 голосов
/ 06 октября 2011

Тем временем я нашел решение. Вы можете проверить размер почтового ящика актера и просто пропустить сообщение, если оно не равно 0.

val worker = new SwingWorker {
  def act() {
    while (true) {
      receive {
        case params: ExperimentParameters => {
          if( mailboxSize == 0) {
            //somehow expensive
            val result = RunExperiments.generateExperimentData(params)
            Swing.onEDT{ GuiElement.redrawWith(result) }
          }
        }
      }
    }
  }
}
1 голос
/ 06 октября 2011

Запомните последнее событие, не обрабатывая его, имейте очень короткий тайм-аут, обработайте последнее событие, когда вы получите тайм-аут

может выглядеть (не проверено)

while(true) {
  var lastReceived : Option[ExperimentParameters] = None
  receive {case params : ExperimentParameters => lastReceived = Some(params)}
  while (!lastReceived.isEmpty) {
    receiveWithin(0) {
      case params: ExperimentParameters => lastReceived = Some(params)
      case TIMEOUT => do your job with lastReceived.get;
    }
  }
}
...