2016-07-18 3 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はシングルスレッドであり、ウィジェットはUIスレッド内からのみアクセスする必要があります。あなたの場合は、ジョブがスケジュールされる前に 'txtpname'の内容を読んで、Job内からどこかにアクセス可能な場所に保管してください。 –

答えて

0

IRunnableWithProgressコードで使用されるバックグラウンドスレッドのUIコードにアクセスすることはできません。

したがって、進行状況ダイアログを実行する前に、UIスレッドのコントロールの値を取得する必要があります。

また、バックグラウンドスレッドでIWorkbenchPageのようなものにアクセスすることはできません。 UI以外のスレッドからUIオブジェクトを更新する場合は、Display.asyncExecまたはDisplay.syncExecを使用して、UIスレッドで更新コードを実行する必要があります。あなたはまた、上記のようなUIスレッド内で呼び出す必要がありますワークベンチページを、必要な場合

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++) 

} 

0

は、以下のようにあなたの進捗モニターを置きます。

+0

の実行に基づく別のメソッドはasyncExecでコードをラップしていますが、nullになります。上記の私のコードを確認してください。 –

+0

nullどこに?この行にstacktrace – SomeDude

+0

"PlatformUI.getWorkbench()。getActiveWorkbenchWindow()"を表示してください。null値が返されます。私はそれを取得する必要はありません私はasyncExec –

関連する問題