4

Swing で作成しているアプリケーションがあります。スクロールとズームが可能なチャート コンポーネントがあり、パンとズームができます。UI が約 750 ミリ秒一時停止することがありますが、その理由がわかりません。これは常に発生するとは限りませんが、アプリケーションで何かが発生し、6 ~ 8 秒ごとにこのように一時停止することがあります。

実行に 750 ミリ秒程度かかるイベントが EDT に配置されていることは明らかです。これは発生すべきではありません。

このように EDT を具体的にプロファイリングするにはどうすればよいですか? 私が本当にやりたいことは、イベントが EDT で実行されるたびに、イベントにかかった合計時間をログまたは System.out に出力することです。これを行う方法はありますか?

または、私のためにこれを実行し、EDT で実行されるすべてのログと所要時間のログを提供するツールはありますか?

このログを調べて、時間がかかっているものをすべて調べて、問題を見つけたいと思います。

4

3 に答える 3

9

この質問を見てください。EDT の簡単なログについて説明します。

次のようなクラスを作成します。

public class TimedEventQueue extends EventQueue {
    @Override
    protected void dispatchEvent(AWTEvent event) {
        long startNano = System.nanoTime();
        super.dispatchEvent(event);
        long endNano = System.nanoTime();

        if (endNano - startNano > 50000000)
            System.out.println(((endNano - startNano) / 1000000)+"ms: "+event);
    }
}

次に、デフォルトの EventQueue をカスタム クラスに置き換えます。

Toolkit.getDefaultToolkit().getSystemEventQueue().push(new TimedEventQueue());
于 2011-04-04T16:56:33.617 に答える
0

EDT で GUI 関連の操作のみを実行していることと、EDT で実行時間の長いタスクがないことを確認してください。SwingExplorerという素晴らしいツールがあり、EDT 操作を監視する機能が 1 つあります。これが役立つことを願っています。

于 2011-04-04T16:42:11.697 に答える
0

これは実際には EDT に関するものではなく、実際にはガベージ コレクションである可能性が高いと思います。

その場合、私は恐れている解決策を知りません。私は実際、Swing でこの種の動作を時々しないものを書いたことはありません。

試してデバッグするには、次を使用して EventQueue をサブクラス化し、新しいものをインストールします。

Toolkit.getDefaultToolkit().getSystemEventQueue().push(xxx);

これにより、少なくとも EDT によって処理されているイベントを確認できます。

于 2011-04-04T16:44:43.077 に答える