2016-07-18 35 views
0

我在下面的代码中得到“无效的线程访问”。我不确定我写错码的位置。我编写代码的主要目的是显示子任务(幕后发生的情况),所以我在调用方法之前添加了子任务。原因:org.eclipse.swt.SWTException:无效的线程访问

 @Override 
     public void handleEvent(Event event) 
     { 
      if((event.keyCode == SWT.CR || event.keyCode == 13 || event.type == SWT.Selection) && btnAdd.isEnabled()) 
      { 
       final PreferencesMO permo = new PreferencesMO(); 
       permo.updatePreferences(); 
       permo.updateDocumentNumber(); 
       final ProjectMO pmo = new ProjectMO(); 
       final CoverSheetMO csmo = new CoverSheetMO(); 
       final CommonError cmerror = new CommonError(); 
       final ParameterConfigurationMO pamo = new ParameterConfigurationMO(); 
       final SnippetNew s = new SnippetNew(); 
       final String projName = txtpname.getText(); 

       Display.getDefault().asyncExec(new Runnable() 
       { 
        public void run() 
        { 
         try 
         { 
          new ProgressMonitorDialog(shell).run(true, true, new IRunnableWithProgress() { 

           @Override 
           public void run(final IProgressMonitor monitor) throws InvocationTargetException, 
             InterruptedException 
           { 
            monitor.beginTask("Import Data", IProgressMonitor.UNKNOWN); 

            monitor.subTask("Connecting to databse..."); 
            for(int i=0;i<=100;i++) 
            { 
             s.method1(i); 
            } 
            //monitor.worked(1); 
            try { Thread.sleep(2000); } catch (Exception e) { } 

            monitor.subTask("Analysing Data..."); 
            try { Thread.sleep(2000); } catch (Exception e) { } 


            if(!projName.equals("")) 
            { 
             monitor.subTask("Updating coversheet ..."); 
             try { Thread.sleep(2000); } catch (Exception e) { } 
             cmerror.updateCoverSheetStatusforNewProject(); 

             monitor.subTask("Inserting Project ..."); 
             try { Thread.sleep(2000); } catch (Exception e) { } 
             pmo.addProjectManager(projName,"T"); 

             monitor.subTask("Searching Project ID ..."); 
             try { Thread.sleep(2000); } catch (Exception e) { } 
             String p_id = pmo.searchprojectID(projName); 
             permo.insertDocumentNumber(p_id); 

             monitor.subTask("Inserting data into coversheet ..."); 
             try { Thread.sleep(2000); } catch (Exception e) { } 
             csmo.insertCoversheet(p_id); 

             pamo.insertParameterConfiguration(p_id); 

             PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell().setText("Demo Tool - "+projName); 

             IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); 
             AuditLogs view = (AuditLogs) page.findView(AuditLogs.ID); 
             IEditorPart editorPart = page.getActiveEditor(); 

             StackedLambdaChartInput input = new StackedLambdaChartInput(); 

             AnalysisResult_MetricsChartInput metricsinput = new AnalysisResult_MetricsChartInput(); 

             StackedLambdaChart_HorizantalInput stackedhorizantalinput = new StackedLambdaChart_HorizantalInput(); 

             AnalysisResult_Metrics_HorizantalChartInput metricshorizantalinput = new AnalysisResult_Metrics_HorizantalChartInput(); 

             BarChartInput inpuit = new BarChartInput(); 

             BarChart_HorizantalInput barchart_horizantalinput = new BarChart_HorizantalInput(); 

             AuditLogMO auditlog = new AuditLogMO(); 

             monitor.subTask("Fetching audit logs to display ..."); 
             try { Thread.sleep(2000); } catch (Exception e) { } 

             java.util.List<java.util.List<String>> auditlogs = auditlog.searchAuditLog(null,null); 
             view.table(auditlogs); 
             try 
             { 
              handlerService.executeCommand(AuditLogView.ID, new Event()); 
              handlerService.executeCommand(ErrorLogView.ID, new Event()); 
              handlerService.executeCommand(DesignHierarchyHandler.ID, new Event()); 
              if(myeditor != null) 
              { 
               if(myeditor instanceof CoverSheet) 
               { 
                handlerService.executeCommand(CoverSheetHandler.ID, new Event()); 
               } 
               else if(myeditor instanceof ParameterConfigurations) 
               { 
                handlerService.executeCommand(ParameterConfigurationHandler.ID, new Event()); 
               } 
              } 
             } 
             catch (ExecutionException | NotDefinedException | NotEnabledException | PartInitException| NotHandledException e1) 
             { 
              e1.printStackTrace(); 
             } 
             Constant con = new Constant(); 
             con.createNewProject(); 
            } 
            //shell.close(); 


            monitor.done(); 
           } 
          }); 
         } 
         catch (InvocationTargetException | InterruptedException e) 
         { 
          e.printStackTrace(); 
         } 
        } 
       }); 
      } 
     } 
+0

向我们展示堆栈跟踪并指出它在此代码中的哪一行。 –

+0

[Java SWT无效的线程访问错误]可能的重复(http://stackoverflow.com/questions/5980316/invalid-thread-access-error-with-java-swt) –

+0

您正试图访问SWT小部件后台线程。这不可能。像大多数UI工具包一样,SWT是单线程的,widget只能从UI线程中访问。在你的情况下,在作业被安排之前阅读'txtpname'的内容并将其存储在作业内可访问的某个地方。 –

回答

0

您无法访问用于IRunnableWithProgress代码的后台线程中的UI代码。

因此,在运行进度对话框之前,您必须在UI线程中获取控件的值。

你也不能在后台线程中访问像IWorkbenchPage这样的东西。如果您想从非UI线程更新UI对象,则需要使用Display.asyncExecDisplay.syncExec在UI线程中运行更新代码。

0

把下面的进度显示器:

Display.getDefault().asyncExec(new Runnable() 
{ 
    IWorkbenchWindow win = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); 
    new ProgressMonitorDialog(shell).run(true, true, new IRunnableWithProgress()  { 

         @Override 
         public void run(final IProgressMonitor monitor) throws InvocationTargetException, 
           InterruptedException 
         { 
          monitor.beginTask("Import Data", IProgressMonitor.UNKNOWN); 

          monitor.subTask("Connecting to databse..."); 
          for(int i=0;i<=100;i++) 

} 

如果你想在工作台页面中,也有类似上面的UI线程中调用。

+0

执行的另一种方法我已经将代码包装在asyncExec中,但是我得到空。请检查我的代码上面。 –

+0

null在哪里?请在这一行显示堆栈跟踪 – SomeDude

+0

“PlatformUI.getWorkbench()。getActiveWorkbenchWindow()”我得到空值。我不应该得到它,即使我已经将代码封装在asyncExec –

相关问题