swt多线程问题

whusha 2009-11-04 10:27:31
蛋贴没人关注,重新发一遍,急啊,100分求助
先上代码:
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
Properties config=new Properties();//记录配置项
try {
config.load(new FileInputStream("integrate.properties"));
config.setProperty("password",text_5.getText());
FileOutputStream outputFile = new FileOutputStream("integrate.properties");
config.store(outputFile, "test");
outputFile.close();
} catch (Exception e1) {
// TODO 自动生成 catch 块
e1.printStackTrace();
}
Display.getCurrent().asyncExec(new Runnable(){

public void run() {
SqlFileExecutor sfe=new SqlFileExecutor(text_2);
try {
sfe.execute("data.sql");
} catch (Exception e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}

}

});

}

问题描述:
此代码是想要在一个shell里的一个按钮添加事件响应,当触发的时候,开启一个新的线程执行数据库建表脚本,表很多,所以要在每成功创建一个表后在该shell的一个text上打印xx表创建成功,
这段代码可以运行,但是在触发事件后,也就是建表,同时text打印信息的时候,只要一点这个界面,这个界面就卡死在那里了,只有等到线程执行完毕后才能恢复,大虾们来帮忙啊,谢
...全文
170 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
truediego 2009-11-05
  • 打赏
  • 举报
回复
你的source结构应该是这样的,
照你现在这种一下子建一堆表的话,是不可能不卡在那里的
必须在你需要往屏幕上打印消息的那个时点调用asyncExec


new Thread(new Runnable() {

public void run() {
while (没建完){
建表;
shlDms.getDisplay().asyncExec(new Runnable(){
public void run() {
打印xx表创建成功;
}
});
next;
}
}
}).start();

whusha 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 redduke1202 的回复:]
asyncExec函数
是指需要将指定的Runnable对象的run方法在“事件指派线程”上执行,也就是在负责界面事件响应及界面重绘的线程里执行。如果你的run方法是一个耗时操作,必然导致界面卡死.

应该将耗时操作新开线程执行,而在任务执行完毕后将设置界面变化的功能代码放到"事件指派线程"上来执行
[/Quote]
可是现在需求就是创建表的过程中动态打印创建的结果,就像杀毒软件显示正在查杀什么文件的情况那样,用swing做的时候就没有这个情况.....
to2楼
我把Display.getCurrent()换成shlDms.getDisplay(),可以运行了,但是效果还是原来那样
「已注销」 2009-11-04
  • 打赏
  • 举报
回复
asyncExec函数
是指需要将指定的Runnable对象的run方法在“事件指派线程”上执行,也就是在负责界面事件响应及界面重绘的线程里执行。如果你的run方法是一个耗时操作,必然导致界面卡死.

应该将耗时操作新开线程执行,而在任务执行完毕后将设置界面变化的功能代码放到"事件指派线程"上来执行
whusha 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 scottxp 的回复:]
随便贴一个你,你试着改一下
Java codeRunnable wie=new Runnable() {
@Overridepublicvoid run() {new Thread(new Runnable() {
@Overridepublicvoid run() {//Display.getCurrent()...放在这里 }
}).start();
}
};
BusyIndicator.showWhile(Display.getCurrent(), wie);
[/Quote]

public void widgetSelected(SelectionEvent e) {

Properties config=new Properties();//记录配置项
try {
config.load(new FileInputStream("integrate.properties"));
config.setProperty("password",text_5.getText());
FileOutputStream outputFile = new FileOutputStream("integrate.properties");
config.store(outputFile, "test");
outputFile.close();
} catch (Exception e1) {
// TODO 自动生成 catch 块
e1.printStackTrace();
}
Runnable wie = new Runnable() {

public void run() {
// TODO 自动生成方法存根
new Thread(new Runnable() {

public void run() {
Display.getCurrent().asyncExec(new Runnable(){

public void run() {
SqlFileExecutor sfe=new SqlFileExecutor(text_2);//这一行报错
try {
sfe.execute("data.sql");
} catch (Exception e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}

}

});

}

}).start();
}

};

BusyIndicator.showWhile(Display.getCurrent(), wie);

}

改成这样了,但是报
Exception in thread "Thread-0" java.lang.NullPointerException
at dmsGui.SWTe_1$2$1$1.run(SWTe_1.java:253)
at java.lang.Thread.run(Unknown Source)
不知道什么原因
scottxp 2009-11-04
  • 打赏
  • 举报
回复
随便贴一个你,你试着改一下
Runnable wie = new Runnable() {
@Override
public void run() {
new Thread(new Runnable() {
@Override
public void run() {
//Display.getCurrent()...放在这里
}
}).start();
}
};
BusyIndicator.showWhile(Display.getCurrent(), wie);
kgxiang 2009-11-04
  • 打赏
  • 举报
回复
卡死可能是因为文件流操作卡死的,文件流操作也需要异步去做。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧