SWT中使用线程后,要改变面板中某个控件的值,报 thread invalid access错误

1 篇文章 0 订阅

最近一直在帮别人调SWT项目的错误,觉得这个错误有必要记下来……

在console中发现是这个错误,我们可以进行如下判断:

1、从console中点击到swt底层代码,会发现,给控件setText()时, setText()方法会调用checkWidgt()方法,

2、checkWidgt()方法会判断现在使用的线程是否是打开面板时的线程,

3、所以,在方法中调用了线程,而线程又要给某个面板中的控件setText()时,就要异步调用setText()。

Display.getDefault().asyncExec(new Runnable(){//在新线程中访问主线程main中的组件,必须使用异步调用方案
                public void run(){
                    EmailChecking.label_1.setText(time);
                    }
 });


我们来看个例子:

                    //发邮件操作
                    SendEmailUtil email=new SendEmailUtil(true);
                    
                    yzm=email.send("13298581430@163.com",toAddr,null);
在send()方法中,调用了新的线程。




新线程中的run()方法:

public void run() {
        // 设置日期2012-12-21
        Calendar c = Calendar.getInstance();
        c.set(2012, 12, 21, 0, 0, 0);
        // 单独设置年、月、日、小时、分钟、秒
        c.set(Calendar.YEAR, 2012);
        c.set(Calendar.MONTH, Calendar.DECEMBER); // 0 表示1月,11 表示12月
        c.set(Calendar.DAY_OF_MONTH, 21);
        c.set(Calendar.HOUR_OF_DAY, 0);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);

        // 获取2012-12-21 0:0:0时间点对应的毫秒数
        long endTime = c.getTimeInMillis();
        // 获取系统当前时间
        Date now = new Date();
        // 获取当前时间点对应的毫秒数
        long currentTime = now.getTime();

        // 计算两个时间点相差的秒数
        long seconds = (endTime - currentTime) / 1000;

        seconds=10;
        boolean flag=true;
        while (flag) {
            final String time="还剩: " + seconds + " 秒";
            Display.getDefault().asyncExec(new Runnable(){//在新线程中访问主线程main中的组件,必须使用异步调用方案
                public void run(){
                    //label.setText(df.format(date));
                    EmailChecking.label_1.setText(time);
                    isTimeOut=true;
                    }
                });
        
                seconds--;
                if(seconds==-1){
                flag=false;
                
                
                }
                
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
        }
        isTimeOut=false;
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值