Как мне профилировать EDT в Swing? - PullRequest
4 голосов
/ 04 апреля 2011

У меня есть приложение, которое я создаю в Swing. У него есть прокручиваемый и масштабируемый компонент диаграммы, который я могу панорамировать и увеличивать. Все гладко, за исключением того, что иногда пользовательский интерфейс останавливается примерно на 750 мс, и я не знаю почему. Это не всегда происходит, но иногда что-то происходит в приложении, и оно начинает останавливаться примерно раз в 6-8 секунд.

Кажется довольно ясным, что на EDT помещается какое-то событие, которое запускается примерно за 750 мс, что не должно происходить.

Как мне конкретно описать EDT? Что я действительно хотел бы сделать, так это получить что-то, что будет выводиться в журнал или System.out каждый раз, когда событие запускается в EDT, с общим количеством времени, которое оно заняло. Есть ли способ сделать это?

Или есть какой-нибудь инструмент, который сделает это для меня и даст мне журнал всего, что работает на EDT, и сколько времени это займет?

Я бы хотел просмотреть этот журнал, посмотреть на все, что занимает много времени, и найти проблему.

Ответы [ 3 ]

9 голосов
/ 04 апреля 2011

Взгляните на этот вопрос . Он описывает простой лог на 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());
0 голосов
/ 04 апреля 2011

Я бы сказал, что, скорее всего, это не что-то из EDT, а сборка мусора.

Предполагая, что это так, я не знаю ни одного решения, я боюсь. На самом деле я никогда не писал ничего на Swing, где бы не было такого поведения.

Чтобы попробовать и отладить, вы можете создать подкласс EventQueue и установить новый, используя:

Toolkit.getDefaultToolkit () getSystemEventQueue () нажмите (ххх)..

Это должно позволить вам хотя бы увидеть, какие события обрабатываются EDT.

0 голосов
/ 04 апреля 2011

Убедитесь, что вы выполняете только операции, связанные с GUI, в EDT, и в EDT нет долго выполняющихся задач. Существует один замечательный инструмент под названием SwingExplorer , у которого есть одна функция для мониторинга операций EDT. Надеюсь, это поможет.

...