簡體   English   中英

丟棄除Scala actor中的最后一條消息以外的所有消息

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM