1

SwingWorker送信されるパラメーター オブジェクトから表示用のプロットを計算するアクターがあります。次に、EDT スレッドにプロットを描画します。一部の GUI 要素は、このプロットのパラメーターを微調整できます。それらが変更されたら、新しいパラメーター オブジェクトを生成してワーカーに送信します。

これはこれまでのところ機能します。

スライダーを動かすと、多くのイベントが作成され、ワー​​カーのメールボックスにキューに入れられます。しかし、最後のパラメーター セットのプロットを計算するだけで済みます。受信トレイからすべてのメッセージを削除する方法はありますか? 最後の 1 つを保持し、それのみを処理しますか?

現在、コードは次のようになっています

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 に答える