【问题标题】:How do I profile the EDT in Swing?如何在 Swing 中分析 EDT?
【发布时间】:2011-04-04 16:33:08
【问题描述】:

我有一个正在 Swing 中构建的应用程序。它有一个可滚动和可缩放的图表组件,我可以平移和放大。整个过程都很流畅,只是有时 UI 会暂停大约 750 毫秒,我不知道为什么。这并不总是发生 - 但有时应用程序中会发生一些事情,并且它每 6-8 秒开始像这样暂停一次。

似乎很清楚,在 EDT 上放置了一些需要 750 毫秒左右才能运行的事件,这不应该发生。

我如何像这样专门分析 EDT?我真正想做的是每次事件在 EDT 上运行时都会输出到日志或 System.out 以及事件所花费的总时间。有没有办法做到这一点?

或者是否有一些工具可以帮我完成这项工作,并给我记录在 EDT 上运行的所有内容以及需要多长时间?

我想通过这个日志,查看所有需要很长时间的内容,然后找到问题。

【问题讨论】:

  • 获得下面的代码后,我所要做的就是等待问题再次发生。结果我有一个无限循环,其中 EDT 上的一个方法只是在 EDT 上放置另一个方法,依此类推。代码指出了我正确的问题,现在它已经修复了。如果没有这个,可能永远不会找到它。谢谢!

标签: java swing profiling event-dispatch-thread


【解决方案1】:

看看这个question。它描述了 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());

【讨论】:

  • +1 太棒了。我粘贴了我最终使用的代码。短小精悍,报告所有需要超过 50 毫秒才能完成的事件。
【解决方案2】:

确保您在 EDT 中仅运行与 GUI 相关的操作,并且 EDT 中没有长时间运行的任务。有一个很棒的工具叫做SwingExplorer 它有一个功能可以监控 EDT 操作。希望这会有所帮助。

【讨论】:

  • 是的,我了解如何使用 EDT。这就是我寻找这个工具的原因。
【解决方案3】:

我想说这可能实际上不是 EDT 上的东西,而是垃圾收集。

假设是这种情况,恐怕我不知道任何解决方案。实际上,我从来没有在 Swing 中写过任何偶尔没有这种行为的东西。

要尝试和调试,您可以继承 EventQueue 并使用以下方法安装一个新的:

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

这至少可以让您看到 EDT 正在处理哪些事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多