我有一个有效的ProgressMonitorDialog,但我想确保我正确设置它。
首先是守则:
创建对话框的方法
public void startProgressBar() {
try {
new ProgressMonitorDialog(getShell()).run(true, true,
new ProgressBarThread());
}
catch (InvocationTargetException e) {
MessageDialog.openError(getShell(), "Error", e.getMessage());
}
catch (InterruptedException e) {
MessageDialog.openInformation(getShell(), "Cancelled", e.getMessage());
}
}
类文件
class ProgressBarThread implements IRunnableWithProgress {
private static final int TOTAL_TIME = 1000;
public ProgressBarThread() {
}
public void run(IProgressMonitor monitor) throws InvocationTargetException,InterruptedException {
monitor.beginTask("Creating PDF File(s): Please wait.....", IProgressMonitor.UNKNOWN);
for (int total = 0; total < TOTAL_TIME ; total++) {
Thread.sleep(total);
monitor.worked(total);
if (total == TOTAL_TIME / 2) monitor.subTask("Please be patient... Operation should finish soon.");
}
monitor.done();
}
}
调用ProgressBar并运行Pdf文件创建操作的方法
private void startSavePdfOperation() {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
startProgressBar();
}
});
saveOp = new AplotSaveOperation(appReg.getString("aplot.message.SAVETOPDF"), "PDF", session);
saveOp.addOperationListener(new MyOperationListener(this) {
public void endOperationImpl() {
java.io.File zipFile = null;
try {
AplotSaveResultsParser.SaveResult saveResults = saveOp.getSaveResults();
if (saveResults != null) {
ETC..... ETC......
问题:
由于ProgressMonitorDialog是一个GUI,它需要在一个执行 Display.getDefault()。asyncExec?
如果ProgressMonitorDialog在一个单独的线程中运行,那么当操作finsihed时它如何知道关闭?
进度条和操作之间是否有任何关系?
我认为ProgressBarThread类中的for循环基本上是保持监视器打开的计时器是正确的吗?
有没有办法提高ProgressMonitorDialog指标的速度,还可以删除取消按钮吗?
这正是我目前正在思考的问题。
我在启动PDF操作侦听器之前启动进度条 请参阅
进度条以未知方式运行,但使用for循环保持进度条对话框打开,同时操作在后台线程上运行。
请参阅上面的Class ProgressBarThread
PDF操作完成后,侦听器操作类将关闭基本GUI对话框。
public void endOperation() {
try {
endOperationImpl();
}
finally {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
w.getShell().setCursor(new Cursor(Display.getCurrent(), SWT.CURSOR_ARROW));
w.recursiveSetEnabled(getShell(), true);
w.getShell().setEnabled(!getShell().getEnabled());
w.close();
}
});
}
}
我不确定ProgressBarThread监视器发生了什么?
这可能吗?
当PDF操作开始时,ProgressMonitorDialog将打开并启动指示器。好吧,保持不知名。
PDF操作完成后,监视器将关闭,然后是基本对话框
我只想打开进度条对话框,告知用户他们的请求在后台运行。
如上所述,上面的代码可以正常工作,但我担心通过关闭Base GUI,破坏我的Progress Thread和Monitor并不是一个好习惯。
答案 0 :(得分:3)
首先,在您的ProgressBarThread#run()
中,您应该使用monitor.worked(1)
。您不需要设置总工作量,但是从上次调用后的工作量增加它。
Q1。是的,它需要在显示线程中执行
Q2。通常,需要完成的工作实际上是在传递给进度监视器对话框的runnable中执行的,这样您就可以准确地报告所取得的进度。因此,应该从ProgressBarThread#run()
内调用您的操作(如果是同步调用),这样只有在一个文件处理完成时才调用monitor.worked(1)。
Q3。你正在运行什么样的操作,也许它已经支持显示进度条,你只需要调用正确的API。它是IUndoableOperation
吗?
Q4。正如我所说,这种方法存在问题,因为只有在操作完成后才能准确报告进度并关闭对话框。但是,如果这是您拥有的唯一选择,那么您可以在某处保存monitor
引用,以便其他线程可以访问它。调用monitor.done()
后,您的ProgressBarThread#run()
应该返回,对话框将关闭。
Q5。您可以通过将正确的参数传递给ProgressMonitorDialog#run(..)
:
new ProgressMonitorDialog(getShell()).run(true, false, new ProgressBarThread());
对于其他问题,如果我知道您正在使用什么样的操作(API),我可以更好地回答。