您的位置:首页 > 其它

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

2015-09-21 20:13 447 查看
最近一直在帮别人调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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: