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 が委譲するメソッドの 1 つの例です。

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 スレッドで run() を呼び出す場合は、fork を true に設定する必要があります。(つまり、実行可能なインスタンスを UI スレッドで実行しないでください。)

UI スレッドは、進行状況バーの更新、再描画などの UI イベントを処理しますが、UI スレッドで時間のかかるタスクを実行すると、スレッドはビジーであるためイベントを処理できません。(そしてイベントはタスクの完了後に処理されます)

于 2013-06-14T01:45:58.567 に答える