以下錯誤是本人學習中碰到的,以後碰到繼續完善:
SWT編程中,當一個類中有一個線程 的時候,這個shell打開又關閉,這樣重複幾次的時候就會出現這樣一個問題:
Failed to execute runnable (org.eclipse.swt.SWTException: Widget is disposed);
解決辦法:經過查資料,以及調試,這個問題是這個shell關閉的時候,其中的某些標籤或者什麼的也被銷燬了,而此時還在往裏面寫東西;就會出現這樣的錯誤;下面是代碼的修改:
應該會很明白;
<span style="color: rgb(70, 70, 70);">未修改前
thread=new Thread(new Runnable() {
public void run() {
while (!shell.isDisposed()) {
display.asyncExec(new Runnable() {
public void run() {
</span><span style="color:#ff0000;"> label_5.setText(AddUsers.time);</span><span style="color:#464646;">
}
});
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
thread.start();
shell.addDisposeListener(new DisposeListener() {
@SuppressWarnings("deprecation")
public void widgetDisposed(DisposeEvent arg0) {
thread.stop();
}
});</span>
修改後
<span style="color:#464646;">thread=new Thread(new Runnable() {
public void run() {
while (!shell.isDisposed()) {
display.asyncExec(new Runnable() {
public void run() {
</span><span style="color:#ff6600;">if(!label_5.isDisposed()){
label_5.setText(AddUsers.time);
}</span><span style="color:#464646;">
}
});
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
thread.start();
shell.addDisposeListener(new DisposeListener() {
@SuppressWarnings("deprecation")
public void widgetDisposed(DisposeEvent arg0) {
thread.stop();
}
});</span>
總結:SWT中,當一個線程在一個類中的時候,這個類的實例被銷燬了,其中的某些標籤要被使用的時候,一定要注意這個標籤是否被銷燬,很簡單的做法就是加判斷。
總結2:不同線程之間的共享資源要放在共享區使用