# [Eclipse] Dialog blockierender Hintergrundjob



## Beni (23. Feb 2008)

*Die Frage*
Ich schreibe ein Eclipse-Plugin mit einem Wizard. Der Wizard muss grosse Mengen von Quellcode herumschieben, und das will man natürlich aus dem GUI-Thread auslagern.

Nun habe ich das Problem, dass:
- Der Wizard-Dialog blockieren soll, solange der Algorithmus läuft.
- Eclipse den Workspace _nicht_ automatisch aktualisieren soll, während ich Dateien verändere.

Wie könnte ich das erreichen?
Gibt es irgendwo einen "Knopf" mit dem ich den Workspace sperren kann?

*Bisheriger Ansatz*
Ich war nicht ganz untätig, und habe schon etwas gebastelt, das funktioniert. Nur bin ich mir unsicher, ob mein Ansatz sicher ist (z.B. bezüglich Deadlocks).

Den Dialog blockiere ich mit IRunnableWithProgress und WizardDialog.run.
Den Workspace blockiere ich mit einem Job und seiner ISchedulingRule.

Also rufe ich einfach das eine aus dem anderen auf:

```
package divider.wizard.jobs;

import ...

// Pseudocode

public class RewriteJob implements IRunnableWithProgress{
    public void run( final IProgressMonitor outerMonitor ){
        final CyclicBarrier barrier = new CyclicBarrier( 2 );
            
        Job job = new Job( "Rewrite" ){
            @Override
            protected IStatus run( IProgressMonitor innerMonitor ) {
                IProgressMonitor monitor = new CombinedProgressMonitor( outerMonitor, innerMonitor );
                        
                monitor.beginTask( "Write bundles", 2000 );
                rufeKompliziertenAlgorithmusAuf( monitor );
                monitor.done();

                barrier.await();
                return Status.OK_STATUS;
            }                
        };
            
        job.setRule( ResourcesPlugin.getWorkspace().getRoot() );
        job.schedule();
            
        barrier.await();
    }
}
```


----------



## Wildcard (23. Feb 2008)

Schon gelesen?
http://www.eclipse.org/articles/Article-Concurrency/jobs-api.html


----------



## Beni (23. Feb 2008)

Aaah, das Dokument kannte ich, aber ich habe wohl nie genügend weit gelesen. Die Lösung ist dann wohl "IJobManager.begin/endRule":


```
package divider.wizard.jobs;
...

public class RewriteJob implements IRunnableWithProgress{
    public void run( IProgressMonitor monitor ) throws InvocationTargetException, InterruptedException {
        ISchedulingRule rule = ResourcesPlugin.getWorkspace().getRoot();
        Job.getJobManager().beginRule( rule, null ); // <<<<
        
        try{
            monitor.beginTask( "Write bundles", 2000 );
            rufeKompliziertenAlgorithmusAuf( monitor ); 
        }
        finally{
            Job.getJobManager().endRule( rule ); // <<<<<
            cancled = monitor.isCanceled();
            monitor.done();
        }
    }
}
```

Danke für den Schups in die richtige Richtung Wildcard


----------

