丢弃除Scala actor中最后一条消息之外的所有消息

时间:2011-10-06 10:07:46

标签: scala actor swingworker scala-swing

我有一个SwingWorker actor,用于计算从它发送的参数对象中显示的图表;然后在EDT线程上绘制图表。一些GUI元素可以调整该图的参数。当他们改变时,我生成一个新的参数对象并将其发送给工人。

到目前为止这是有效的。

现在,当移动滑块时,会创建许多事件并在工作人员的邮箱中排队。但我只需要计算最后一组参数的图。有没有办法从收件箱中删除所有邮件;保留最后一个并仅处理它?<​​/ p>

目前代码如下所示

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 个答案:

答案 0 :(得分:2)

与此同时,我找到了解决方案。您可以检查actor的邮箱大小,如果不是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 :(得分:1)

记住最后一个事件而不处理它,有一个非常短的超时,当你得到超时时处理最后一个事件

看起来像(未经测试)

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;
    }
  }
}