我使用的是一个Eclipse插件的IProgressMonitor (3.7)。各种方法调用.setTaskName(String)和.worked(int)。当我运行它时,它正在执行的任务会更新,但进度条上的绿色进度永远不会前进。以下是部分代码:
在这里调用IProgressMonitor.beginTask,然后调用doFinish并将监视器传递给它:
public boolean performFinish() {
IRunnableWithProgress op = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException {
try {
monitor.beginTask("Building project...", 10);
doFinish(projectNamePage.getComposite(), new GridLayout(), monitor);
} catch (CoreException e1) {
e1.printStackTrace();
} finally {
monitor.done();
}
}
};
try {
getContainer().run(false, false, op);
} catch (InterruptedException e) {
return false;
} catch (InvocationTargetException e) {
Throwable realException = e.getTargetException();
MessageDialog.openError(getShell(), "Error", realException.getMessage());
e.printStackTrace();
return false;
}
return true;
}doFinish方法委托给其他方法。
private void doFinish(Composite container, GridLayout layout, IProgressMonitor pmp) throws CoreException {
//Get the root of the current Eclipse workspace
IWorkspaceRoot iwr = ResourcesPlugin.getWorkspace().getRoot();
//Create a new project with the name requested in SampleNewWizardPage.
IProject project = iwr.getProject(projectNamePage.getFileName().split("\\.")[0]);
IProjectDescription description = null;
project.create(pmp);
project.open(pmp);
description = project.getDescription();
pmp.worked(1);
IJavaProject javaProject = setProjectDescription(description, project, pmp);
setRawClasspathEntryList(pmp, javaProject);
IFolder sourceFolder = buildSourceFolder(project, pmp);
String jarFilePath = downloadAlgoraphJar(javaProject, iwr, pmp);
buildAlgoSettingsFile(javaProject, iwr, pmp);
populateClasspath(sourceFolder, javaProject, jarFilePath, pmp);
buildPackageWithSkeleton(javaProject, sourceFolder, pmp);
}以下是doFinish委托给的方法之一的示例:
private void setRawClasspathEntryList(IProgressMonitor pmp, IJavaProject javaProject) {
pmp.setTaskName("Building classpath...");
List<IClasspathEntry> entries = new ArrayList<IClasspathEntry>();
entries.add(JavaRuntime.getDefaultJREContainerEntry());
try {
javaProject.setRawClasspath(entries.toArray(new IClasspathEntry[entries.size()]), pmp);
} catch (JavaModelException e) {
e.printStackTrace();
}
pmp.worked(1);
}发布于 2013-06-14 09:45:59
如果在UI Thread中调用run(),则必须将fork设置为true。(即runnable实例不应在UI线程中运行。)
UI线程处理UI事件,如更新进度条、重绘等,但如果您在UI线程中运行耗时的任务,线程将无法处理这些事件,因为它很忙。(事件将在任务完成后处理)
https://stackoverflow.com/questions/17096030
复制相似问题