[英]Discard all messages except the last one in a Scala actor
我有一個SwingWorker
actor,它從發送的參數對象中計算出要顯示的圖; 然后在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) }
}
}
}
}
}
同時,我找到了解決方案。 您可以檢查參與者的郵箱大小,如果不為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) }
}
}
}
}
}
}
記住上一個事件而不處理它,超時時間很短,在收到超時后處理上一個事件
看起來像(未經測試)
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;
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.