写程序总是能遇到种种不同的矛盾问题,好多都是没遇到的,有些是别人没遇到过的,无法再网上找到同样的经历的答案。这时我们该怎么做?
- 首先要分析问题原因所在,什么情况出现这问题,尝试着去调试,有些问题很明显,有些需求去猜测。
- 其次就是不断测试种种可能。
- 最后应该对那种可能进行细分和处理。
这次在做项目,项目是RCP界面客户端,新需求都改造好了,功能都实现了。最后测试的在关闭功能时候,出现了问题。关闭功能做了修改,添加了一个确认框。
写的代码就那么几行
public boolean preWindowShellClose() {
MessageBox msgBox = new MessageBox(new Shell(), SWT.YES | SWT.NO| SWT.ICON_QUESTION);
msgBox.setText("退出系统");
msgBox.setMessage("确定退出系统?");
if (msgBox.open() == SWT.YES) {
// 退出请求
MonitorUtil.sendLogout();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.exit(0);
LogCvt.info("正在关闭窗口....");
return true;
}
return false;
}
我后来进行调试,调试情况让我明白一件事在确认框提示msgBox.open() 之后要获取用户选择的结果时阻塞住了,永远都得不到,就死卡在了open()状态,点击“是”或“否”按钮,确认框能消失,但是界面无法关闭或卡片,点击不了任何东西。
这可以说明,那确认框是居于父窗体模式,子窗体是点击不了的,不管你是否点击了是或者否按钮,当前有一个线程就是获取不到事件来通知这主线程我选择的是或者是否,返回open函数后的int信息(SWT.YES or SWT.NO),所以卡在了哪里。
这我猜测,但是确实是这个情况。我测试过把确认框MessageBox 对象去掉,立马能关掉。那就是这MessageBox 惹的祸,为啥我改了新功能就出了这问题呢?
我思考我新功能加了什么?我的界面接收消息是被动推送过来的,还有统计同能,数据刷新的很厉害,平均每秒都有几十条数据刷新过来,还是多个服务器发送过来的,UI界面刷新频率很高,TABLE对象也时常在更新(我用压力测试工具频率调的有点高,多个服务器多个压力测试工具在进行测试,客户端就这一个接受多个客户端数据)。
这一情况下,我就想到msgBox.open() 窗体打开之后一直无法返回用户点击是或者否按钮的事件来返回选择的是YES 还是NO情况。肯定是那线程被别的占用了,无法等待用户选择是还是否按钮情况。问题是那线程被谁占用了呢,一想肯定是数据刷新频率很高,占用了那线程。
那我是不是应该在关闭的时候先停止了数据的刷新,选择了是或者否的时候在开始数据接收显示呢。
于是我在数据接收端添加了个boolean isCloseWindows = false,当我点击了关闭按钮,把isCloseWindows改成true;然后再进行提示确认框。很显然我测试通过了,解决了这个特殊的情况。
修改了关闭按钮代码
public boolean preWindowShellClose() {
//禁止推送数据,否则无法退出系统,卡屏.
SendMsgToUI.setCloseWindows(true);
MessageBox msgBox = new MessageBox(new Shell(), SWT.YES | SWT.NO| SWT.ICON_QUESTION);
msgBox.setText("退出系统");
msgBox.setMessage("确定退出系统?");
if (msgBox.open() == SWT.YES) {
// 退出请求
MonitorUtil.sendLogout();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.exit(0);
LogCvt.info("正在关闭窗口....");
return true;
}
SendMsgToUI.setCloseWindows(false);
return false;
}
开始之前将SendMsgToUI.setCloseWindows(true);设置ture停止接收数据,
如果选择了否SendMsgToUI.setCloseWindows(false);改回来,继续接收数据。
这样就解决了这情况。随笔记录了下来。
- 大小: 25.1 KB
分享到:
相关推荐
Eclipse rcp 实现文本内容对比功能,可自己选取对比的文件进行比较
RCP&OSGI;
RCP在线升级RCP在线升级RCP在线升级RCP在线升级RCP在线升级
RCP导出EXE 老大难问题。 RCp 程序导出步骤,保证能够导出~
Eclipse RCP允许开发者使用eclipse结构风格设计弹性的可扩展的应用程序,可重用Eclipse中已存在的方法和编码模式。俗话说,万事开头难。Eclipse RCP入手可能会比较困难、费时。接下来我们将主要讲述如何让RCP工作. ...
clipse RCP允许开发者使用eclipse结构风格设计弹性的可扩展的应用程序,可重用Eclipse中已存在的方法和编码模式。俗话说,万事开头难。Eclipse RCP入手可能会比较困难、费时。接下来我们将主要讲述如何让RCP工作 ...
有关rcp的内容 是rcp入门的好帮手,rcp自学的好帮手
RCP与GEF的课件,简单的介绍了RCP和GEF中的各组件的功能,已经工作流程
Eclipse RCP开发教程,RCP入门教程,教你如何使用SWT Eclipse RCP开发教程,RCP入门教程,教你如何使用SWT Eclipse RCP开发教程,RCP入门教程,教你如何使用SWT Eclipse RCP开发教程,RCP入门教程,教你如何使用SWT
Eclipse RCP富客户端平台,基于Eclipse开发的。
RCP项目的登录窗体RCP项目的登录窗体RCP项目的登录窗体RCP项目的登录窗体
RCP源码例子 RCP源码例子 RCP源码例子
RCP 常见的扩展点指南 RCP最精华的部分之一,详细分析了RCP如何建立扩展点的。
EclipseRcp 例子程序
rcp for java one
eclipse rcp check table
eclipse rcp 例子 源码
eclipse RCP 入门教程 ,大家不要错过哦
RCP系统使用的弹出式日期控件,可切换上月下月,前一年后一年,可选择年、月
RCP 产品介绍图片