Интенсивные вычисления и SWT - PullRequest
3 голосов
/ 20 марта 2012

В Swing я создаю SwingWorkers или использую invokeLater для выполнения трудоемких вычислений без нарушения потока графического интерфейса Swings. Как это сделать в SWT? Я пишу код, используя Callable и Future, но я не думаю, что это сократит его:

class MyClass extends ViewPart { 

    .
    .
    .
    @Override
    public void createPartControl(final Composite arg0) {
        this.runScenarioItem.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(final SelectionEvent e) {                
                    final ScenarioDialog scenarioDialog = new ScenarioDialog(arg0.getShell(), SWT.DIALOG_TRIM
                            | SWT.APPLICATION_MODAL);
                    final Scenario scenario = scenarioDialog.open();
                    if (suvConnection.isConnected()) {
                        runScenarioItem.setEnabled(false);
                        try {
                            final ScenarioRunner runner = new ScenarioRunner(suvConnection, scenario);
                            final ExecutorService executor = new ScheduledThreadPoolExecutor(1);
                            final Future<Integer> future = executor.submit(runner);
                            System.out.println("result of callable = " + future.get());
                            runScenarioItem.setEnabled(true);

                        }
                        catch (final Exception e1) {
                            e1.printStackTrace();
                        }
                    }
                }
            });
    }
}

EDIT:

Я пытаюсь добавить следующий фрагмент в класс интенсивных вычислений:

            final Display display = this.shell.getDisplay();
            display.asyncExec(new Runnable() {
                public void run() {
                    if (!display.isDisposed()) {
                        display.readAndDispatch();
                    }
                }
            });

Я обновлю, когда у меня будет больше информации. Человек я скучаю по Swing ...

Ответы [ 2 ]

3 голосов
/ 20 марта 2012

Во-первых, вам следует избегать субъективных впечатлений в вашем вопросе, они не помогают ответить на вопрос, во-вторых, фрагмент кода, как получить доступ к виджетам из другого потока, см. здесь , почему это необходимо, см. здесь и если вы используете SWT в сочетании с Eclipse RCP Framework, вам следует рассмотреть возможность обработки долго выполняющихся процессов в Eclipse Jobs .

3 голосов
/ 20 марта 2012

Вы хотите позвонить asyncExec на дисплее.Пожалуйста, прочитайте SWT Threading Issues документ для получения более подробной информации.

Вот соответствующий пример кода из этого документа, который показывает, как использовать его для перерисовки окна:

// do time-intensive computations
...
// now update the UI. We don't depend on the result,
// so use async.
display.asyncExec (new Runnable () {
   public void run () {
      if (!myWindow.isDisposed())
         myWindow.redraw ();
   }
});
// now do more computations
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...