我有一个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) }
}
}
}
}
}
答案 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;
}
}
}