`

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
分享到:
评论

相关推荐

    RCP自定义透视图切换按钮的右键菜单

    在Eclipse RCP(Rich Client Platform)开发中,创建用户友好的界面是至关重要的。一个常见的需求是定制透视图(Perspective)的交互方式,包括切换按钮和右键菜单。本教程将详细介绍如何通过`org.eclipse.ui....

    RCP编程入门(doc版)

    RCP提供了一套完整的生命周期管理,包括启动、运行、暂停、恢复和关闭应用程序。此外,它还支持国际化和本地化,以及丰富的用户界面元素,如视图、编辑器、透视图等。 **二、RCP开发环境搭建** 要开始RCP编程,首先...

    rcp.zip_DEMO_RCP dialog_java rcp_rcp

    这个"rcp.zip_DEMO_RCP_dialog_java rcp_rcp"压缩包显然是一个针对RCP初学者的学习资源,包含了几个示例项目,帮助用户理解和实践RCP的基本概念和技术。 首先,我们要关注的是"demo_rcp_dialog"。在Java RCP中,...

    Eclipse RCP培训.zip

    10. **RCP应用生命周期**:从启动到关闭,Eclipse RCP应用有一套完整的生命周期管理,包括启动配置、初始化、运行以及退出阶段。 11. **插件开发**:开发Eclipse RCP应用涉及创建插件项目、定义插件依赖、编写插件...

    基于Eclipse RCP Email客户端的实现

    《基于Eclipse RCP Email客户端的实现》这篇本科毕业设计论文详细探讨了如何利用Java语言,结合Eclipse插件开发技术、RCP(Rich Client Platform)、EMF(Eclipse Modeling Framework)以及Java Mail工具包来构建一个...

    Eclipse RCP程序ViewPart占位功能的实现

    本教程将深入探讨如何在Eclipse RCP程序中实现ViewPart的占位功能,这对于构建具有多视图的工作环境至关重要。 首先,我们需要理解ViewPart的基本概念。在Eclipse RCP中,ViewPart是用户界面中的一个组件,它通常...

    基于RCP的影院管理系统

    该系统利用了Java的Rich Client Platform(RCP),这是一种强大的框架,允许开发者创建功能丰富的桌面应用,提供与操作系统深度集成的本地用户体验。 RCP是Eclipse基金会开发的一种技术,它为开发人员提供了构建...

    eclipse rcp 开发基础教程

    9. **RCP应用生命周期**:理解从启动到关闭的整个应用程序生命周期,包括初始化、保存和恢复状态、事件处理等。 10. **Extension Points**:这是Eclipse插件系统的关键特性,允许开发者通过定义和实现扩展点来扩展...

    rcp 学习资料下载,一个简单的rcp例子

    视图是显示特定数据或功能的窗口,可以被独立打开或关闭;编辑器则用于编辑和查看数据,类似于传统IDE中的代码编辑器;透视图则是对工作台布局的组织,允许用户根据工作需求自定义视图和编辑器的排列。 压缩包中的...

    eclipse rcp

    Eclipse RCP允许开发者创建功能丰富的、自定义的、独立的桌面应用,同时利用Eclipse的开发工具集进行高效开发。 Eclipse RCP的核心是其插件模型,它将应用程序拆分为一系列可独立开发、部署和升级的组件。每个插件...

    RCP程序中集成其他插件的配置方法

    本篇文章将深入探讨如何在RCP程序中集成其他插件,以增强应用程序的功能和用户体验。 首先,理解RCP的插件体系结构至关重要。Eclipse RCP是基于插件模型的,每个插件代表了应用中的一个功能模块。通过声明依赖关系...

    rcp menubarpath和toolbarpath的参考值

    ### Eclipse RCP MenubarPath 和 ToolbarPath 参考值详解 #### 一、MenubarPath 概述 在 Eclipse RCP(Rich Client Platform)应用程序中,`menubarPath` 是用来定义菜单结构的一种方式。通过指定不同的路径,可以...

    RCP常用方法,RCP常用方法

    ### RCP常用方法详解 #### 一、闪屏画面(Splash Screen) 在应用程序启动时,通常需要一段时间来进行初始化处理,为了提升用户体验并避免用户在等待过程中感到困惑,可以通过设置一个闪屏画面(splash screen)来...

    rcp editor实例的项目代码

    RCP是Eclipse框架提供的一种用于构建桌面应用程序的平台,它允许开发者利用Eclipse的强大功能来创建定制化的、可扩展的应用程序。 在Eclipse插件开发中,编辑器(Editor)是用户界面的核心组件,用于处理特定类型的...

    一个简单的Eclipse RCP 源码示例

    Eclipse Rich Client Platform (RCP) ...总的来说,这个简单的Eclipse RCP源码示例提供了一个基础的学习平台,通过研究和实践,开发者能够深入理解Eclipse RCP的强大功能,并逐步创建出复杂、功能丰富的桌面应用程序。

    eclipse rcp demo

    2. **插件(Plugins)**:Eclipse RCP是基于插件架构的,每个功能或模块都是一个独立的插件。这种设计允许高度的模块化和可扩展性,开发者可以轻松地添加、移除或替换功能。 3. **模型(Model)**:在Eclipse RCP中...

    rcp editor实例的项目代码2

    RCP (Rich Client Platform) 是Eclipse框架提供的一种用于构建桌面应用程序的开发平台。它允许开发者利用Eclipse的强大功能来创建复杂、可扩展且具有丰富用户界面的应用程序。本项目"rcp editor实例的项目代码2"是...

    Java RCP企业应用快速开发框架

    Java RCP(Rich Client Platform)是Oracle公司推出的用于构建桌面应用程序的一种框架,它基于Java Swing技术,提供了丰富的用户界面和强大的功能,使得开发者能够快速创建出具有专业外观和功能的桌面应用。Java RCP...

    EclipseRCP系统开发与实战(书).rar

    - Eclipse RCP是一种基于Java的开发平台,它允许开发者利用Eclipse IDE的强大功能来创建具有丰富用户界面的桌面应用程序。 - RCP的基石是插件系统,插件之间通过接口进行交互,实现了模块化的程序设计。 - RCP...

Global site tag (gtag.js) - Google Analytics