学无先后,达者为师

网站首页 编程语言 正文

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

栏目分类
最近更新