如何在Swing中对EDT进行分析?

4
我正在使用Swing构建一个应用程序,其中包含可以滚动和缩放的图表组件,我可以在其中进行平移和缩放。整个过程很流畅,但有时UI会暂停约750毫秒,我不知道为什么。这种情况并不总是发生,但有时在应用程序中发生某些事情,并且开始每6-8秒钟暂停一次。
似乎很明显有一些事件被放置在EDT上,需要大约750毫秒才能运行,这不应该发生。
我如何专门对EDT进行分析?我真正想做的是获得一个能够输出到日志或System.out的东西,每次事件在EDT上运行时都会将事件总共花费的时间输出。有没有办法做到这一点?
或者是否有一些工具可以为我完成这项任务,并给我提供运行在EDT上的所有内容及其所需的时间的日志?
我想浏览此日志,查看所有花费较长时间的内容,并找到问题所在。

一旦我得到了下面的代码,我只需要等待问题再次发生。结果我有一个无限循环,在EDT上的一个方法只是将另一个方法放在EDT上,如此往复。这段代码直接指向了问题,现在已经修复了。如果没有这个,可能永远不会找到它。谢谢! - Erick Robertson
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());

1
+1 太棒了。我贴上了最终使用的代码。简洁明了,报告所有耗时超过 50 毫秒的事件。 - Erick Robertson

0

请确保您只在EDT中运行与GUI相关的操作,并且没有长时间运行的任务在EDT中。有一个很棒的工具叫做SwingExplorer,它有一个监视EDT操作的功能。希望这能帮到您。


是的,我明白如何使用EDT。这就是为什么我正在寻找这个工具的原因。 - Erick Robertson

0

我认为这很可能不是EDT上的问题,而是垃圾回收。

假设是这种情况,恐怕我不知道任何解决方案。实际上,我从未编写过任何没有偶尔出现此类行为的Swing代码。

为了尝试调试,您可以子类化EventQueue并使用以下命令安装一个新的:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接