RCP关闭功能无法关闭,有点意思

写程序总是能遇到种种不同的矛盾问题,好多都是没遇到的,有些是别人没遇到过的,无法再网上找到同样的经历的答案。这时我们该怎么做?


  1. 首先要分析问题原因所在,什么情况出现这问题,尝试着去调试,有些问题很明显,有些需求去猜测。
  2. 其次就是不断测试种种可能。
  3. 最后应该对那种可能进行细分和处理。
这次在做项目,项目是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);改回来,继续接收数据。

这样就解决了这情况。随笔记录了下来。


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RCP(Rich Client Platform)是一种基于Eclipse平台开发的富客户端应用程序。RCP自定义属性窗口是指在RCP应用程序中,可以根据需求自定义的属性窗口。 RCP自定义属性窗口的作用主要是用于展示和编辑对象的属性信息。在一个RCP应用程序中,我们可以使用自定义属性窗口来实现对应用程序中的某个对象的属性进行展示和操作。通过自定义属性窗口,我们可以方便地查看和修改对象的各种属性,从而实现对应用程序的定制和扩展。 为了实现RCP自定义属性窗口,我们需要进行以下步骤: 1. 定义属性模型:首先,我们需要定义对象的属性模型,即属性的名称、类型和值等信息。可以通过创建一个Java类来表示属性模型,包括属性的getter和setter方法。 2. 创建属性视图:接下来,我们需要创建一个属性视图,用于展示属性的列表和详细信息。可以使用Eclipse提供的表格或树形控件来展示属性列表,选中某个属性后,可以在详细信息区域显示该属性的具体数值,并提供修改该属性值的功能。 3. 绑定属性和视图:将属性模型与属性视图进行绑定,即将属性模型中的属性值与属性视图中的控件进行关联。通过数据绑定的方式,当属性值发生变化,属性视图中的控件自动更新,并且当用户修改了属性视图中的控件,属性模型中的属性值也会相应地更新。 4. 注册属性窗口:最后,将属性窗口注册到RCP应用程序中的相应位置,使用户可以方便地打开和关闭属性窗口。 总之,RCP自定义属性窗口可以帮助我们实现对RCP应用程序中对象的属性展示和操作,提供了一种高度定制和扩展的方式。我们可以根据实际需求定义属性模型并创建属性视图,实现对对象属性进行灵活的展示和修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值