ProgressMonitorDialog

maestr0

Bekanntes Mitglied
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.

Java:
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".
 
Zuletzt bearbeitet von einem Moderator:

Sonecc

Gesperrter Benutzer
Nutze das IRunnableWithProgress: Help - Eclipse Platform

Ein solches Runnable kann dann wie folgt gestartet werden:

Java:
		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

Bekanntes Mitglied
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:)

Java:
      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");
      }
 
S

SlaterB

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

maestr0

Bekanntes Mitglied
Java:
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)
 
S

SlaterB

Gast
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

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

Java:
    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();
      }
 
S

SlaterB

Gast
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

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

Die Fehlermeldung ist folgende:

Code:
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.
 


Schreibe deine Antwort... und nutze den </> Button, wenn du Code posten möchtest...

Neue Themen


Oben