# ProgressMonitorDialog



## maestr0 (10. Apr 2012)

Hallo,

folgende Problemstellung:

Entwickle gerade ein Plugin und möchte in der performFinish() Methode ein ProgressMonitorDialog erstellen,jedoch habe ich das noch nie gemacht und jeglicher Versuch schlägt etwa mit einem "Invalid Thread access" Fehler oder mit einer InvocationTargetException fehl. Ich möchte einfach nur in einer Ladeleiste die Projekterstellung im PackageExplorer angezeigt bekommen.


```
Runnable runnable = new Runnable()
      {
         public void run()
         {
            try
            {
               projects = modulePage.getSelectedProjects();

               for (int i = 0; i < projects.size(); i++)
               {


                  projectDotProjectFile = new Path(String.valueOf(projects.get(i)));
                  projectDescription = workspace.loadProjectDescription(projectDotProjectFile);
                  project = workspace.getRoot().getProject(projectDescription.getName());
                  JavaCapabilityConfigurationPage.createProject(project, projectDescription.getLocationURI(), null);

               }
            }
            catch (CoreException e)
            {
               Activator.error(e);
            }
         }
      };


      workbench.getDisplay().syncExec(runnable);
```

Soweit mein funktionierender Code,jedoch weiß ich echt nicht weiter,wie genau ich um die Projekterstellung nun ein PMD baue,dass z.b. bei der Erstellung von 10 Projekten,nach jedem Projekt,also nach 10 % im PMD angezeigt wird "Projekt 1... wurde erstellt".


----------



## Sonecc (10. Apr 2012)

Nutze das IRunnableWithProgress: Help - Eclipse Platform

Ein solches Runnable kann dann wie folgt gestartet werden:


```
ProgressMonitorDialog dialog = new ProgressMonitorDialog(Display.getCurrent().getActiveShell());
		try {
			dialog.run(true, true, runnable);
		} catch (InvocationTargetException e) {
			LOG.error("An Exception occured while opening back view", e);
		} catch (InterruptedException e) {
			LOG.error("An Exception occured while opening back view", e);
		}
```


----------



## maestr0 (10. Apr 2012)

Danke für die schnelle Antwort,das Interface habe ich auch schon mal probiert,jedoch ohne Erfolg.
Und nun erscheint wieder eine InvocationTargetException.
Also irgendwas mache ich da falsch


```
IRunnableWithProgress runnable = new IRunnableWithProgress()
      {

         @Override
         public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException
         {
            try
            {
               projects = modulePage.getSelectedProjects();

               for (int i = 0; i < projects.size(); i++)
               {

                  monitor.beginTask("Projekte werden erstellt",projects.size());

                  projectDotProjectFile = new Path(String.valueOf(projects.get(i)));
                  projectDescription = workspace.loadProjectDescription(projectDotProjectFile);
                  project = workspace.getRoot().getProject(projectDescription.getName());
                  JavaCapabilityConfigurationPage.createProject(project, projectDescription.getLocationURI(), null);

                  monitor.worked(1);
            
               }

            }
            catch (CoreException e)
            {
               Activator.error(e);
            }
            monitor.done();
         }
      };


      ProgressMonitorDialog dialog = new ProgressMonitorDialog(Display.getCurrent().getActiveShell());
      try
      {
         dialog.run(true, true, runnable);
      }
      catch (InvocationTargetException e)
      {
         System.out.println("InvocationTargetException");
      }
      catch (InterruptedException e)
      {
         System.out.println("InterruptedException");
      }
```


----------



## SlaterB (10. Apr 2012)

gibt Fehler mit e.printStackTrace(); oder auf anderem Wege aus, vielleicht steht was wichtiges drin


----------



## maestr0 (10. Apr 2012)

```
java.lang.reflect.InvocationTargetException
	at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:421)
	at org.eclipse.jface.dialogs.ProgressMonitorDialog.run(ProgressMonitorDialog.java:507)
	at org.sourcepit.b2eclipse.ui.B2Wizard.performFinish(B2Wizard.java:122)
	at org.eclipse.jface.wizard.WizardDialog.finishPressed(WizardDialog.java:827)
	at org.eclipse.jface.wizard.WizardDialog.buttonPressed(WizardDialog.java:432)
	at org.eclipse.jface.dialogs.Dialog$2.widgetSelected(Dialog.java:624)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:240)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4165)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3754)
	at org.eclipse.jface.window.Window.runEventLoop(Window.java:825)
	at org.eclipse.jface.window.Window.open(Window.java:801)
	at org.eclipse.ui.internal.handlers.WizardHandler$Import.executeHandler(WizardHandler.java:150)
	at org.eclipse.ui.internal.handlers.WizardHandler.execute(WizardHandler.java:277)
	at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:293)
	at org.eclipse.core.commands.Command.executeWithChecks(Command.java:476)
	at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:508)
	at org.eclipse.ui.internal.handlers.HandlerService.executeCommand(HandlerService.java:169)
	at org.eclipse.ui.internal.handlers.SlaveHandlerService.executeCommand(SlaveHandlerService.java:241)
	at org.eclipse.ui.internal.actions.CommandAction.runWithEvent(CommandAction.java:157)
	at org.eclipse.ui.internal.actions.CommandAction.run(CommandAction.java:171)
	at org.eclipse.ui.actions.ImportResourcesAction.run(ImportResourcesAction.java:97)
	at org.eclipse.ui.actions.BaseSelectionListenerAction.runWithEvent(BaseSelectionListenerAction.java:168)
	at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:584)
	at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:501)
	at org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionContributionItem.java:411)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4165)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3754)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2701)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2665)
	at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2499)
	at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:679)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:668)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:123)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1410)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1386)
Caused by: org.eclipse.swt.SWTException: Invalid thread access
	at org.eclipse.swt.SWT.error(SWT.java:4282)
	at org.eclipse.swt.SWT.error(SWT.java:4197)
	at org.eclipse.swt.SWT.error(SWT.java:4168)
	at org.eclipse.swt.widgets.Widget.error(Widget.java:468)
	at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:359)
	at org.eclipse.swt.widgets.Tree.getItems(Tree.java:3249)
	at org.eclipse.jface.viewers.TreeViewer.getChildren(TreeViewer.java:171)
	at org.eclipse.jface.viewers.CheckboxTreeViewer.internalCollectChecked(CheckboxTreeViewer.java:316)
	at org.eclipse.jface.viewers.CheckboxTreeViewer.getCheckedElements(CheckboxTreeViewer.java:229)
	at org.sourcepit.b2eclipse.ui.B2WizardPage.getSelectedProjects(B2WizardPage.java:100)
	at org.sourcepit.b2eclipse.ui.B2Wizard$1.run(B2Wizard.java:92)
	at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:121)
```


----------



## SlaterB (10. Apr 2012)

nicht dass ich irgendwas von SWT wüßte, 
aber 'SWTException: Invalid thread access' kann man auch in Suchmaschinen eintippen und führt z.B. zur FAQ:
The SWT FAQ


----------



## maestr0 (10. Apr 2012)

Habs jetzt noch ein bisschen umstrukturiert,aber immer noch dieselben Exceptions.


```
IRunnableWithProgress runnable = new IRunnableWithProgress()
      {

         @Override
         public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException
         {
            projects = modulePage.getSelectedProjects();
            monitor.beginTask("Projekte werden erstellt", projects.size());

            for (total = 0; total < projects.size(); total++)
            {
               if (monitor.isCanceled())
                  return;


               monitor.subTask("Schritt " + total);
               workbench.getDisplay().syncExec(new Runnable()
               {

                  public void run()
                  {

                     try
                     {
                        projectDotProjectFile = new Path(String.valueOf(projects.get(total)));
                        projectDescription = workspace.loadProjectDescription(projectDotProjectFile);
                        project = workspace.getRoot().getProject(projectDescription.getName());
                        JavaCapabilityConfigurationPage.createProject(project, projectDescription.getLocationURI(),
                           null);
                     }
                     catch (CoreException e)
                     {
                        e.printStackTrace();
                     }


                  }
               });

            }


            monitor.done();
         }
      };


      ProgressMonitorDialog dialog = new ProgressMonitorDialog(Display.getCurrent().getActiveShell());
      try
      {
         dialog.run(true, true, runnable);
      }
      catch (InvocationTargetException e)
      {
         e.printStackTrace();
      }
      catch (InterruptedException e)
      {
         e.printStackTrace();
      }
```


----------



## SlaterB (10. Apr 2012)

getSelectedProjects() in org.sourcepit.b2eclipse.ui.B2WizardPage ist deine eigene Klasse oder?
der Fehlermeldung nach führt getSelectedProjects() und dann CheckboxTreeViewer.getCheckedElements() zu dem bösen Zugriff,
das ist bei dir nicht im syncExec() drin,

den kompletten Code dort hinein zu schieben ist aber wahrlich keine schöne Vorstellung,
wozu dann überhaupt noch das IRunnableWithProgress, was immer das ist?

ich persönlich kann dazu leider nicht mehr sagen, hoffentlich meldet sich noch wer anders


----------



## Sonecc (10. Apr 2012)

Das liegt daran, dass du den falschen Code im UIThread ausführst.

Die Fehlermeldung ist folgende:


```
Caused by: org.eclipse.swt.SWTException: Invalid thread access
    at org.eclipse.swt.SWT.error(SWT.java:4282)
    at org.eclipse.swt.SWT.error(SWT.java:4197)
    at org.eclipse.swt.SWT.error(SWT.java:4168)
    at org.eclipse.swt.widgets.Widget.error(Widget.java:468)
    at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:359)
    at org.eclipse.swt.widgets.Tree.getItems(Tree.java:3249)
    at org.eclipse.jface.viewers.TreeViewer.getChildren(TreeViewer.java:171)
    at org.eclipse.jface.viewers.CheckboxTreeViewer.internalCollectChecked(CheckboxTreeViewer.java:316)
    at org.eclipse.jface.viewers.CheckboxTreeViewer.getCheckedElements(CheckboxTreeViewer.java:229)
>>    at org.sourcepit.b2eclipse.ui.B2WizardPage.getSelectedProjects(B2WizardPage.java:100)
    at org.sourcepit.b2eclipse.ui.B2Wizard$1.run(B2Wizard.java:92)
    at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:121)
```

An der mit >> markierten Stelle wird die Methode verlassen, die du hier im Sourcecode angehängt hast. Dies ist das erste überhaupt, was gemacht wird in deiner hier geposteten Methode.


----------



## maestr0 (10. Apr 2012)

Danke,klappt jetzt


----------

