私はあなたの賢明さに提出したいGUIの問題から来るユースケースを持っています.
使用事例
ユーザーがGUIで設定したいくつかのパラメーターに応じて計算結果を表示するGUIがあります。たとえば、ユーザーがスライダーを動かすと、いくつかのイベントが発生し、すべてが新しい計算をトリガーします。ユーザーがスライダーの値を A から B に調整すると、多数のイベントが発生します。
ただし、計算には数秒かかる場合がありますが、スライダーの調整では数 100 ミリ秒ごとにイベントが発生する可能性があります。
これらのイベントをリッスンし、結果の再描画が活発になるようにそれらをフィルタリングする適切なスレッドを作成する方法は? 理想的には、次のようなものが必要です
- 最初の変更イベントが受信されるとすぐに新しい計算を開始します。
- 新しいイベントが受信された場合は最初の計算をキャンセルし、新しいパラメーターで新しいイベントを開始します。
- ただし、最後に完了した計算は、最後に更新されたパラメーターを持つものである必要があるため、最後のイベントが失われないようにしてください。
私が試したこと
私の友人 (A. Cardona) は、あまりにも多くのイベントが計算をトリガーするのを防ぐアップデータ スレッドのこの低レベルのアプローチを提案しました。ここにコピーして貼り付けます(GPL):
彼はこれを Thread を拡張するクラスに入れます。
public void doUpdate() {
if (isInterrupted())
return;
synchronized (this) {
request++;
notify();
}
}
public void quit() {
interrupt();
synchronized (this) {
notify();
}
}
public void run() {
while (!isInterrupted()) {
try {
final long r;
synchronized (this) {
r = request;
}
// Call refreshable update from this thread
if (r > 0)
refresh(); // Will trigger re-computation
synchronized (this) {
if (r == request) {
request = 0; // reset
wait();
}
// else loop through to update again
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void refresh() {
// Execute computation and paint it
...
}
パラメータが変更されたことを示すイベントが GUI によって送信されるたびに、 を呼び出しますupdater.doUpdate()
。これにより、メソッドのrefresh()
呼び出し回数が大幅に減少します。しかし、私はこれを制御できません。
別の方法?
それを行う別の方法があるかどうか疑問に思っていました。それは、jaca.concurrent クラスを使用します。しかし、Executors フレームワークで、何から始めるべきかを分類できませんでした。
同様のユースケースの経験がある人はいますか?
ありがとう