首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IProgressMonitor .worked(int)未更新进度条

IProgressMonitor .worked(int)未更新进度条
EN

Stack Overflow用户
提问于 2013-06-14 04:06:09
回答 1查看 1.4K关注 0票数 2

我使用的是一个Eclipse插件的IProgressMonitor (3.7)。各种方法调用.setTaskName(String)和.worked(int)。当我运行它时,它正在执行的任务会更新,但进度条上的绿色进度永远不会前进。以下是部分代码:

在这里调用IProgressMonitor.beginTask,然后调用doFinish并将监视器传递给它:

代码语言:javascript
复制
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方法委托给其他方法。

代码语言:javascript
复制
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委托给的方法之一的示例:

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

发布于 2013-06-14 09:45:59

如果在UI Thread中调用run(),则必须将fork设置为true。(即runnable实例不应在UI线程中运行。)

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17096030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档