日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

SWT線程訪問無效:org.eclipse.swt.SWTException: Invalid thread access

作者:夢凝哲雪 更新時間: 2022-02-22 編程語言

SWT線程訪問無效

場景

在Java的GUI項目中使用另外的線程實現頁面的動態刷新效果

例如:時間的實時顯示

現象

線程訪問無效

org.eclipse.swt.SWTException: Invalid thread access

方案

	public void showTime(Label label) {
		new Thread() {//線程操作
            public void run() {
                while(true){
                    try {
                        //對Label進行實時刷新, 異步 
                    	//常規方案 非UI線程無法直接操作UI線程 SWT異常 Invalid thread access 
	                     label.getDisplay().asyncExec(new Runnable() {       
	                         @Override
	                         public void run() {
	                             // 設置時間 ,格式化輸出時間
	                             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"
	                             		+ " HH:mm:ss");
	                             String s = sdf.format(new Date());
	                             label.setText(s);//渲染到Label上            
	                         }
	                     });
	                     Thread.sleep(1000);//線程休眠1秒  意味著每隔一秒刷新一次
                    } catch (Exception e) {
                    	
                    }
                }
            }
		}.start();
	}

原因

在SWT程序中,SWT會自動創建一個UI線程,所謂的主界面,

而某個按鈕或事件觸發的另一個事件發生時,起一個線程去處理這個事件,這個線程叫非UI線程。

強調:

非UI線程是不能直接操作UI線程

問題:

因為非UI線程找不到對應的Display。如果您了解Display功能就會很容易理解這個問題。

Display的作用就是負責enent loop, font,color,UI線程和其他線程的通信的橋梁

重點

那么一定要在非UI線程中修改界面內容 又如何實現呢 ?

獲取橋梁然后異步通訊

Display.getDefault().syncExec(new Runnable(){ })

原文鏈接:https://blog.csdn.net/Klhz555/article/details/118466066

欄目分類
最近更新