2

我正在为 Eclipse 插件(3.7)使用 IProgressMonitor。各种方法调用 .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);
}
4

1 回答 1

2

如果在 UI Thread 中调用 run(),则必须将 fork 设置为 true。(也就是说,runnable 实例不应该在 UI Thread 中运行。)

UI 线程处理 UI 事件,如更新进度条、重绘等,但如果您在 UI 线程中运行耗时的任务,该线程将无法处理事件,因为它很忙。(任务完成后处理事件)

于 2013-06-14T01:45:58.567 回答