2012-03-20 117 views
3

Swing中,我创建了SwingWorkers或使用invokeLater在不扰动Swings GUI线程的情况下进行时间密集型计算。 SWT中如何做到这一点?我正在写使用可赎回和将来的代码,但我不认为这会削减它:时间密集型计算和SWT

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

编辑:

我想下面的代码片段添加到我的密集型计算类:

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

我会在有更多信息时更新。我想念秋千的男人...

回答

3

首先,你应该避免你的问题的主观印象,他们不帮忙解答一个问题,第二个片段如何从另一个线程访问小部件,请参阅here,为什么这是必要的,请参阅here,如果您将SWT与Eclipse RCP框架结合使用,则应考虑处理Eclipse Jobs中的长时间运行的进程。

+0

谢谢汤姆。对不起,没有帮助的咆哮:) – 2012-03-20 17:34:27

+0

请将相关部分复制到您的答案,因为网络上的所有网站来去。 – Shiki 2014-01-17 10:46:44

3

你想在Display上拨打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 
... 
+0

我看到了这个文档,但我仍然不明白。你是说我更新我的数字处理代码中的显示吗? SWT确实是垃圾。 – 2012-03-20 04:54:41

+1

Display.asyncExec大致等同于SwingUtilities.invokeLater。你将Runnables传递给两者。两者都将采用该Runnable,然后在主UI线程上安排它。由于两者都是异步的,所以UI更新不会立即发生,但是如果这样做是可以的。 – louielouie 2012-03-20 04:58:38

+1

你能发布一个工作片段吗?不会运行此代码饿死UI线程? – 2012-03-20 05:01:42