最近有不少的事情,没有坚持写博客,今晚心还是没有静下来,不过还是把一些这段时间的工作和学习的经验写下来与大家分享。
最近在使用eclipse的rcp作为平台在做一些工具类的应用。其中有一些就是要使用socket来监听服务端socket的返回消息,同时接受socket服务端的广播消息。
最后显示在rcp对话框的一个text组件中,刚开始觉得很简单,直接对socket的DataInputStream使用线程,在新的线程中使用while(true)来不停的dins.readUTF(),
然后在此循环中使用 text.setText(str),同时在启动线程的地方先把此线程设置为后台线程,以为这样就可以了,然后保存运行,客户端发送消息接着报错了,错误
提示socket datainputstream线程不可以操作display所在的线程。
此时一片茫然,不知为啥,经过初步的研究发现,其实rcp的界面是在display的一个线程中,其他线程不可以对rcp中的组件做更改,也就是说必须在一个display线程中,
由于我的这个需求有点不同,就是必须要有个死循环来不停的读socket服务端是否广播了消息,如果广播了就要接受然后展示,也就是说无法把此代码实现放到eclipse rcp自
带的display.asynexec()中,同时由于对rcp界面元素的刷新尽量要放到job中,而对于ui界面的,尽量放至uijob中。
此时想到了个曲线救国的道路,我们为了不直接修改rcp的界面元素,我们可以把socket datainputstream线程读取的信息放到一个成员变量中,然后我们在UIJOB中设置
text组件的内容(setText),而对于线程的启动我们可以在display所在界面类中定义一个定时任务,使用定时任务来无限的启动这个job,果然,通过这样的设计成功的实现
了对rcp组件内容的刷新。
就写到这里吧,不知道各位有没有遇到此类问题,欢迎指正给出更好的解决办法。有时间写一下flex中的关于弹出框的一些注意点。