多くのスレッドが StyledTextBox に急速に書き込みを行っている Java アプリがあります。ある時点で、すべてのスレッドが終了します。ただし、おそらくディスパッチ キューが少しバックアップされたため、TextBox はしばらくテキストを受信し続けます。スレッドが終了したときに TextBox への更新がすぐに終了するように、何らかの方法で EDT を強制的にフラッシュすることは可能ですか?
ありがとう、ジム
多くのスレッドが StyledTextBox に急速に書き込みを行っている Java アプリがあります。ある時点で、すべてのスレッドが終了します。ただし、おそらくディスパッチ キューが少しバックアップされたため、TextBox はしばらくテキストを受信し続けます。スレッドが終了したときに TextBox への更新がすぐに終了するように、何らかの方法で EDT を強制的にフラッシュすることは可能ですか?
ありがとう、ジム
ここpush()
に示すように、独自のEventQueue
サブクラスを作成し、独自のメソッドを追加してキューを空にすることができます。キューが空の場合はブロックされるため、最初に確認してください。flush()
getNextEvent()
peekEvent()
変更したテキストを適用するためのキューを使用し、戻る前にキューを空にするイベントと EDT をスケジュールします。これにより、スレッドが終了し、EDT でさらに 1 つのスケジュールされたイベントが実行されると、「空の」イベントが発生します。
私は解決策を見つけました。アイデアは、テキストが に追加されるたびに呼び出される「検証」リスナーをインストールすることStyledText
です。そのため、(バックアップされたディスパッチ キューから) テキストが追加されようとしているとき、コードは、スレッドが終了したかどうかを示すフラグが設定されているかどうかを調べます。スレッドが終了している場合は、テキストの更新を無視します。これにより、イベント キューを排出しながら、コントロールの更新を停止できます。次のコード スニペットは、この問題を解決します。
txtOutput
StyledText
コントロールです。スレッドが終了したときに
endingThreads
設定boolean
されます。
これは、SWT アプリケーションで問題を処理する最も簡単な方法のようです。true
txtOutput.addVerifyListener(new VerifyListener() {
public void verifyText(VerifyEvent e)
{
if( !endingThreads )
{
e.doit = true;
}
else
{
e.doit = false;
}
}
});