Failed to execute runnable (org.eclipse.swt.SWTException: Widget is disposed)原因以及解決辦法

以下錯誤是本人學習中碰到的,以後碰到繼續完善:

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:不同線程之間的共享資源要放在共享區使用


發佈了43 篇原創文章 · 獲贊 18 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章