Вызывается: org.eclipse.swt.SWTException: Неверный доступ к потоку

eclipse-rcp

463 просмотра

2 ответа

17 Репутация автора

Я получаю «Неверный доступ к потоку» в коде ниже. Я не уверен, где я написал неправильный код. Мое основное намерение написать код - просто отобразить подзадачу (то, что происходит за сценой), поэтому я добавил подзадачу перед вызовом метода.

        @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();
                        }
                    }
                });
            }
        }
Автор: Rahul Prajapati Источник Размещён: 18.07.2016 01:39

Ответы (2)


0 плюса

94417 Репутация автора

Вы не можете получить доступ к коду пользовательского интерфейса в фоновом потоке, используемом для IRunnableWithProgressкода.

Таким образом, вы должны получить значения элементов управления в потоке пользовательского интерфейса, прежде чем запускать диалог прогресса.

Вы также не можете получить доступ к вещам, как IWorkbenchPageв фоновом потоке. Если вы хотите обновить объекты пользовательского интерфейса из потока, не являющегося пользовательским интерфейсом, вам необходимо использовать Display.asyncExecили Display.syncExecзапустить код обновления в потоке пользовательского интерфейса.

Автор: greg-449 Размещён: 18.07.2016 02:28

0 плюса

4658 Репутация автора

Поместите свой монитор прогресса как ниже:

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

}

Если вам нужна страница рабочего места, она также должна вызываться в потоке пользовательского интерфейса, как описано выше.

Автор: SomeDude Размещён: 18.07.2016 02:35
Вопросы из категории :
32x32