当前位置: 首页 > 面试题库 >

进度条更新器耗尽CPU

孙泉
2023-03-14
问题内容

我想让我的用户了解I / O操作的进度。目前,我有一个内部类,在开始I / O之前要开始学习,在完成后停止。看起来像这样:

class ProgressUpdater implements Runnable {

        private Thread thread;
        private long last = 0;
        private boolean update = true;
        private long size;

        public ProgressUpdater(long size) {
            this.size = size;
            thread = new Thread(this);
        }

        @Override
        public void run() {
            while (update) {
                if (position > last) {
                    last = position;
                    double progress = (double) position / (double) size * 100d;
                    parent.setProgress((int) progress);
                }
            }
        }

        public void start() {
            thread.start();
        }

        public void stop() {
            update = false;
            parent.setProgress(100);
        }
    }

parent是我对UI的引用,position是我的外部类中的一个字段,表示我们在I / O中取得的进步。我将停止时的进度设置为100%,因为有时I
/ O完成并停止我的更新程序,然后它才能完成更新以前的增量。那只是确保它是100%。

目前,这可行,我像这样使用它:

ProgressUpdater updater = new ProgressUpdater(file.length());
updater.start();
//do I/O
//...
updater.stop();

问题在于循环严重地吞噬了CPU。我试图在那里扔一个锁(带有等待/通知),但是我不知道在使用等待/通知时我在做什么,所以它只是挂了我的线程。我该怎么做才能阻止它使用那么多CPU周期?


问题答案:

您应该考虑使用SwingWorker。基本上,您在SwingWorker提供的后台线程上执行所有IO
,并且有向swing线程报告进度的内置方法。

然后,无论何时更新该职位,您都可以自动更新进度,而不是连续轮询,这是您到目前为止所做的。

看看Swingworker超时或带有FileReader的SwingWorker看看是否有帮助。

另一种解决方案,如果您不想使用SwingWorker,可能就是这样做,而不是更新该position值,而是直接调用进度条,如下所示:

SwingUtilities.invokeLater(new Runnable() {
    @Override public void run() {
        getMyProgressBar().setValue(position);
    }
});

假设您已设置进度条,使其最大为文件的大小。



 类似资料:
  • 我的kivy应用程序中有一个ProgressBar。我相信我需要使用,以确保从循环内部更新进度条。 以下代码是用于再现性目的的淡化版本。 ProgressBar类 主要类别: KV文件 此示例显示loading_pb.value按钮单击后代码循环时发生的变化。 进步吧。价值印刷输出 问题进度条的值似乎确实如预期的那样递增,但实际进度条直到循环结束时才立即改变。 相关的 无法更新kivy进度条 ki

  • 无尽的进度条是一款玩法独特另类的休闲类游戏。 在此款游戏中,没有华丽的界面,动人的 BGM,甚至几乎没有什么可以操作的内容。无尽的进度条游戏是一种生活的消遣,可以在你疲惫的时候调节你的心情。

  • 我在Android上用RxJava更新ProgressBar的进度有问题我想在延迟500毫秒后更新1%(从0%- 下面是我的代码:

  • 我有一个通过互联网下载文件的应用程序。应用程序开始下载,但不知道如何显示进度条。以下适配器类: 以下是下载文件的类: 现在我卡住了如何更新进度条!任何想法

  • 我有一个相当棘手的问题。 我所拥有的:

  • 问题内容: 基本上,我正在为外部登录系统执行AJAX请求,如何根据请求的长度来更新进度栏? 例如,请求需要 1.30s 至 1.40s的时间 才能完成,我如何根据特定的间隔更新进度条,例如每10ms进行10%的更新,等等,这是进度条的HTML布局 使用属性确定进度条的长度 想法是基本上让它看起来像是基于请求进行更新,因此当请求完成时,百分比栏已满 问题答案: 我认为这篇文章非常清楚 http://