Posted on 2006-02-21 17:01
fortune 閱讀(1084)
評論(0) 編輯 收藏 所屬分類:
java技術
多線程問題:SWT使用Display類來維護GUI及其使用的系統資源。它禁止用戶在其他線程下訪問GUI資源。例如:
public void run() {
butt.setText("test");
}
這樣的寫法會導致非法線程異常。如果需要在其他線程下訪問GUI資源可以使用如下方法:
Display.getCurrent().asyncExec(new Thread () {
public void run() {
butt.setText("test");
}
})
- Display提供同步異步方法分別是: syncExec(Runnable)和asyncExec(Runnable)。
- 對于Display,在同一個線程里,不能申明2個Display實例。同樣的,一個Display實例也不能跨線程使用。也就是說,如果你要在另外一個線程中顯示一個窗體,你必須另外創建一個Display實例。不然會導致異常。)
線程問題
在任何操作平臺的GUI系統中,對構件或一些圖形API的訪問操作都要被嚴格同步并串行化。例如,在一個圖形界面中的按鍵構件可被設成可用狀態(enable)或禁用狀態(disable),正常的處理方式是,用戶對按鍵狀態設置操作都要被放入到GUI系統的事件處理隊列中(這意味著訪問操作被串行化),然后依次處理(這意味著訪問操作被同步)。想象當按鍵可用狀態的設置函數還沒有執行結束的時候,程序就希望再設置該按鍵為禁用狀態,勢必會引起沖突。實際上,這種操作在任何GUI系統都會觸發異常。
Java語言本身就提供了多線程機制,這種機制對GUI編程來說是不利的,它不能保證圖形構件操作的同步與串行化。SWT采用了一種簡單而直接的方式去適應本地GUI系統對線程的要求:在SWT中,通常存在一個被稱為"用戶線程"的唯一線程,只有在這個線程中才能調用對構件或某些圖形API的訪問操作。如果在非用戶線程中程序直接調用這些訪問操作,那么SWTExcepiton異常會被拋出。但是SWT也在*.widget.Display類中提供了兩個方法可以間接的在非用戶線程的進行圖形構件的訪問操作,這是通過的syncExec(Runnable)和asyncExec(Runnable)這兩個方法去實現的。例如:
//此時程序運行在一個非用戶線程中,并且希望在構件panel上加入一個按鍵。
Display.getCurrent().asyncExec(new Runnable() {
public void run() {
Button butt = new Button(panel,SWT.PUSH);
butt.setText("Push");
}
});
方法syncExec()和asyncExec()的區別在于前者要在指定的線程執行結束后才返回,而后者則無論指定的線程是否執行都會立即返回到當前線程。