2017-04-20 60 views
0

我往前走了,這裏是我的ViewPart時類:查看沒有更新同步

public class Exp extends ViewPart { 

public static final String ID = "edu.bitsgoa.views.Exp"; //$NON-NLS-1$ 
public static Text text; 

public Exp() { 
} 

@Override 
public void createPartControl(final Composite parent) { 

    ScrolledComposite sc = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL); 
    Composite composite = new Composite(sc, SWT.NONE); 
    sc.setContent(composite); 
    composite.setLayout(new GridLayout(2, false)); 

    text = new Text(composite, SWT.BORDER | SWT.WRAP | SWT.V_SCROLL | SWT.MULTI | SWT.READ_ONLY); 
    text.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1)); 
    Font newFont=new Font(text.getDisplay(),new FontData("Monospace",10,SWT.NATIVE)); 
    text.setFont(newFont); 

    GridDataFactory.fillDefaults().grab(true, true).hint(400, 400).applyTo(text); 
    sc.setExpandHorizontal(true); 
    sc.setExpandVertical(true); 
    sc.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT)); 

    createActions(); 
    initializeToolBar(); 
    initializeMenu(); 
} 


private void createActions() { 
    // Create the actions 
} 
private void initializeToolBar() { 
    IToolBarManager toolbarManager = getViewSite().getActionBars() 
      .getToolBarManager(); 
} 
private void initializeMenu() { 
    IMenuManager menuManager = getViewSite().getActionBars() 
      .getMenuManager(); 
} 
public void setFocus() { 
    // Set the focus 
} 

} 

我創建這個類作爲一個控制檯,這樣我可以從我的自定義插件打印上的數據。這是我顯示在其上的數據(這可能是一個非常幼稚的做法,但工程在一定程度上):

public static void display(final String message){ 
    Display.getDefault().asyncExec(new Runnable() { 
     @Override 
     public void run() { 
      Exp.text.append(message); 
      Exp.text.append("\n"); 
     } 
    }); 
} 

這種方法在一些不同的類。每當我有到控制檯上打印的東西,我稱這種方法爲:

Preparation.display("Calculating parameters...); 
calculateParameters(); 
Preparation.display("Done"); 

現在的問題是,在上述三線,數據不被打印在控制檯上爲:

Calculating parameters... 
(wait for some time, calculate parameters) 
Done 

相反,參數被首先計算,然後一切被印刷一次,如:

(wait for some time, calculate parameters) 
Calculating parameters... 
Done 

我希望它是同步完成,如我所說的顯示方法。總的來說,我對SWT和Java圖形非常陌生。任何想法,我可能會出錯?

謝謝!

+0

你不顯示的代碼輸出「(等待一段時間......」。它是在不同的線程?它是否使用相同的'Preparation.display() '你有沒有注意到你調用'asyncExec()'而不是'syncExec()'? –

+0

這段代碼沒什麼特別之處,它只是運行一個可執行文件,並將結果打印到一個外部.txt文件。不是在不同的線程中運行,我只是調用一個方法我試過syncExec(),但它似乎沒有幫助。 –

+0

你是否正在獨立線程中運行'Preparation.display'代碼?如果你正在UI線程'asyncExec'沒有用處,只會延遲一些事情。爲了得到你想要的東西,你必須在一個單獨的線程中運行計算代碼。 –

回答

1

在UI線程中長時間運行的任務將鎖定用戶界面,沒有任何操作會更新,直到完成。您必須使用後臺線程。

由於您要阻止SWT readAndDispatch循環甚至以前完成的操作,因此長時間運行的代碼啓動可能不會發生,直到代碼由於它們依賴於調度循環而結束。

您可以使用普通的Thread作爲後臺代碼,也可以使用Eclipse Job。工作可讓您更新報告工作進展的「進度監控器」。

在後臺線程中,您可以使用asyncExecsyncExec方法Display在UI線程中運行代碼。

欲瞭解更多詳情,請參閱Eclipse Jobs and Background Processing