2013-09-27 94 views
0

我正在使用Display.getDefault().asyncExec()開始新線程。線程是這樣的:SWT UI即使在啓動新線程時也會掛起

public void run() 
{ 
    while (! condition) 
    { 
     //do some processing 
     mainWindow.updateStatus(..); //this will call a setText method on a label in 
        //the original thread 
    } 
} 

但是,當我運行此線程時,程序掛起,而不是在標籤中順利顯示狀態。我究竟做錯了什麼?

+0

'Display.asyncExec()'不會啓動一個新的線程。請參見[Display.getCurrent()。asyncExec不是並行運行?](http://stackoverflow.com/questions/6994720/display-getcurrent-asyncexec-not-run-in-parallel)。 –

+0

@MarttiKäärik那麼我該如何運行一個新的線程,它也將更新SWT UI? – user2790209

+0

@MarttiKäärik如果我嘗試從另一個線程訪問用戶界面,如果我沒有記錯的話,會導致一些線程訪問錯誤。 – user2790209

回答

4

您誤解了線程的概念。你所說的線程實際上只是你計劃在(UI)線程上執行的一段代碼。

通常,UI線程上的代碼應儘快執行並儘快返回。你的while循環很可能違反了這條規則。解決方法是從UI線程中取出循環,即運行方法,並將其放在Display.asyncExec()呼叫周圍。

3

要擴大Käärik的回答了一下:你的代碼看起來應該像

public class MyTask implements Runnable { 
    public void run() 
    { 
     while (! condition) 
     { 
      //do some processing without touching the screen 
      Display.getDefault().asyncExec(new Runnable() { 
       public void run() { 
        mainWindow.updateStatus(..); 
       } 
      }); 
     } 
    } 
} 

然後運行它作爲new Thread(new MyTask())或如安排在線程池中重複每10秒。

相關問題