您的位置:首页 > 编程语言

在用SWT进行socket编程中遇到的一些问题的总结

2010-12-27 13:26 603 查看
在把awt转换成swt的编写过程中遇到了很多问题,不过最终还是解决了。做以下总结:

1.UI线程与非UI线程的联系。

在swt中,UI线程只有能一个,第一个运行UI的线程创建了DISPLAY实例即为UI线程,不一定为MAIN所在的主线程。其他线程如果要进行UI操作,必须通过UI线程的同步syncExec或者异步asyncExec操作来执行。不然会抛出SWT的SWTException非法线程介入错误。在其他线程调用UI的地方用

Display.getDefault().asyncExec(new Runnable()

{

public void run()

{ ....UI操作代码即可 }

});

swt的这种机制起先非常不了解,不过通过查阅相关的java 论坛,了解到这种方式有利于维护界面的稳定性,让界面只处于一个UI线程控制之下。也提高了程序的效率。

 2.socket中 getinputstream()和getoutputstream()的联系。

当客户端发出socket请求之后,就会打开socket的 getinputstream()和getoutputstream()流,当执行到socket.getinputstream()的时候,在服务器响应之情会一直阻塞,所以在服务器端一定要先getoutputstream(),然后在getinputstream(),不然客户端和服务器会相互等待引起死锁。还有个问题跟swt的机制有关,因为swt的非UI线程中的UI部分需有UI线程调用,这两者不能并行执行,如果在主线程中有个客户端getinputstream()处于阻塞,然后在把服务器上的getoutputstream()和getinputstream()写在非UI线程的UI模块中,这样在本机测试的时候也会引起互相等待而引起死锁,客户端等待服务器的流,而服务器等待主线程的执行完毕。这样,日后再写程序过程中需养成一个好习惯只把有关UI的操作写在非UI线程的

3.在程序编完后还遇到了swt 程序关闭的时候会出现进程中还有javaw进程的情况.

解决办法:在主程序的关闭按钮上添加监听事件,加上Display.getDefault().dispose()方法和System.exit(0)即可。还有关于swt打包成jar文件,swt导出的jar文件运行方式.在生成的jar文件中的mainfest.mf中添加一行代码Class-Path: swt.jar 然后把swt.jar与要运行的jar文件放在同一目录下即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息