`

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

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);改回来,继续接收数据。

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


 

  • 大小: 25.1 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics