我想让我的用户了解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://