В 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 ...