引起:org.eclipse.swt.SWTException:无效的线程访问

时间:2016-07-18 13:39:45

标签: eclipse-rcp

我在下面的代码中得到“无效的线程访问”。我不知道我在哪里写错了代码。我编写代码的主要目的是显示子任务(场景后面发生了什么),所以我在调用方法之前添加了子任务。

        @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();
                        }
                    }
                });
            }
        }

2 个答案:

答案 0 :(得分:0)

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

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

您也无法在后台线程中访问IWorkbenchPage之类的内容。如果要从非UI线程更新UI对象,则需要使用Display.asyncExecDisplay.syncExec在UI线程中运行更新代码。

答案 1 :(得分: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线程中调用它。