1

我有一个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) }
        }
      }
    }
  }
}
4

2 回答 2

2

同时,我找到了解决方案。您可以检查参与者的邮箱大小,如果它不为 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) }
          }
        }
      }
    }
  }
}
于 2011-10-06T11:06:29.560 回答
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;
    }
  }
}
于 2011-10-06T11:06:34.913 回答