通过多线程增加 JavaFX 中 ProgressBar 的进度
Increase progress of ProgressBar in JavaFX via multiple threads
我正在创建一个 JavaFX 应用程序,它将通过网络发送多个文件,并且我希望有一个进度条显示已发送的字节数。我已经知道了即将发送的文件的总大小,但是我不知道如何增加进度条。
问题是,我同时发送文件,所以我不能只在下载中设置进度 class,因为那样会被另一个威胁覆盖。
这是我的下载 class 的样子:
iStream = socket.getInputStream();
bufferSize = socket.getReceiveBufferSize();
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos);
byte[] bytes = new byte[bufferSize];
int count;
while ((count = is.read(bytes)) >= 0) {
bos.write(bytes, 0, count);
}
bos.close();
is.close();
我正在按以下方式执行 class:
List<Callable<String>> downloadTasks = new ArrayList<>();
Callable<String> download = new Download(new File(path), portnumber);
downloadTasks.add(download);
es.invokeAll(downloadTasks);
我在两个 classes 中都有变量 long totalSize
中的总字节数。
你能帮我看看如何实现字节进度条吗?谢谢
您只能从单个线程更新进度条:FX 应用程序线程。所以线程问题没有实际意义;您可以只增加一个 属性 代表下载的字节总数,并安排只从该线程更新它。
所以像这样:
public class UploadProgressMonitor {
private final long totalBytes ;
private long downloadedBytes ;
private final ReadOnlyDoubleWrapper progress = new ReadOnlyDoubleWrapper() ;
public UploadProgressMonitor(long totalBytes) {
this.totalBytes = totalBytes ;
}
private void doIncrement(long bytes) {
downloadedBytes += bytes ;
progress.set(1.0 * downloadedBytes / totalBytes);
}
public void increment(long bytes) {
if (Platform.isFxApplicationThread()) {
doIncrement(bytes);
} else {
Platform.runLater(() -> doIncrement(bytes));
}
}
public ReadOnlyDoubleProperty progressProperty() {
return progress.getReadOnlyProperty() ;
}
public final double getProgress() {
return progressProperty().get();
}
}
现在您可以执行以下操作:
long totalBytes = ... ;
UploadProgressMonitor monitor = new UploadProgressMonitor(totalBytes);
progressBar.progressProperty().bind(monitor.progressProperty());
如果您为每个任务提供对 UploadProgressMonitor
的引用,它只需要做:
int count;
while ((count = is.read(bytes)) >= 0) {
bos.write(bytes, 0, count);
monitor.increment(count);
}
我正在创建一个 JavaFX 应用程序,它将通过网络发送多个文件,并且我希望有一个进度条显示已发送的字节数。我已经知道了即将发送的文件的总大小,但是我不知道如何增加进度条。
问题是,我同时发送文件,所以我不能只在下载中设置进度 class,因为那样会被另一个威胁覆盖。
这是我的下载 class 的样子:
iStream = socket.getInputStream();
bufferSize = socket.getReceiveBufferSize();
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos);
byte[] bytes = new byte[bufferSize];
int count;
while ((count = is.read(bytes)) >= 0) {
bos.write(bytes, 0, count);
}
bos.close();
is.close();
我正在按以下方式执行 class:
List<Callable<String>> downloadTasks = new ArrayList<>();
Callable<String> download = new Download(new File(path), portnumber);
downloadTasks.add(download);
es.invokeAll(downloadTasks);
我在两个 classes 中都有变量 long totalSize
中的总字节数。
你能帮我看看如何实现字节进度条吗?谢谢
您只能从单个线程更新进度条:FX 应用程序线程。所以线程问题没有实际意义;您可以只增加一个 属性 代表下载的字节总数,并安排只从该线程更新它。
所以像这样:
public class UploadProgressMonitor {
private final long totalBytes ;
private long downloadedBytes ;
private final ReadOnlyDoubleWrapper progress = new ReadOnlyDoubleWrapper() ;
public UploadProgressMonitor(long totalBytes) {
this.totalBytes = totalBytes ;
}
private void doIncrement(long bytes) {
downloadedBytes += bytes ;
progress.set(1.0 * downloadedBytes / totalBytes);
}
public void increment(long bytes) {
if (Platform.isFxApplicationThread()) {
doIncrement(bytes);
} else {
Platform.runLater(() -> doIncrement(bytes));
}
}
public ReadOnlyDoubleProperty progressProperty() {
return progress.getReadOnlyProperty() ;
}
public final double getProgress() {
return progressProperty().get();
}
}
现在您可以执行以下操作:
long totalBytes = ... ;
UploadProgressMonitor monitor = new UploadProgressMonitor(totalBytes);
progressBar.progressProperty().bind(monitor.progressProperty());
如果您为每个任务提供对 UploadProgressMonitor
的引用,它只需要做:
int count;
while ((count = is.read(bytes)) >= 0) {
bos.write(bytes, 0, count);
monitor.increment(count);
}