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;
}
在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;
}
相关文章推荐
- Canvas 画布小案例
- MyEclipse参加ibatis DTD文件实现xml自己主动提示功能
- Ogre 3DMax导出插件oFusion
- jsp 乱码处理方法
- php apc上传文件带进度
- 0-1背包:nefu19采药hdu2546饭卡
- OCP-V13-637
- ViewPager可滑动页面+点击标题栏切换视图
- 原生JS修改标签样式为带阴影效果
- leetcode-35 Search Insert Position
- C++类的拷贝构造函数和赋值构造函数
- 04-Block的使用注意
- MVC图片上传
- LintCode--翻转二叉树(非递归)
- HDu 2010 水仙花数
- OpenGL入门
- Java编程思想第四版读书笔记——第四章 控制执行流程
- php上传带进度
- LintCode -- 寻找缺失的数
- 蓝懿iOS培训日志17 Jason和Segue