当前位置: 首页 > news >正文

display.syncExec方法例子

一个SWT程序至少需要一个Display对象,创建Display的线程称为UI线程,一个线程中不能有两个Display。
第一次调用Display.getDefault()会创建一个Display,以后再次调用会返回创建的Display。
或者显式定义一个Display:Display dis=new Display(),以后调用getdefault()也会返回创建的Display。
 多线程程序中,采用Display.getCurrent()可以获取当前线程的Display,调用Display.findDisplay(Thread)可以找到任意线程的Display。
在多线程中不要使用getDefault(),容易导致非法线程访问异常。
Shell代表一个窗口,可以基于Display创建Shell,或者基于父Shell创建子shell,若父shell被关闭,子Shell也自动关闭。
使用Display.getMonitors()可以获取与Display相关的所有监视器,getPrimaryMonitor()可以获取主监视器,监视器(Monitor)的边界代表屏幕大小,客户区通常小于监视器尺寸.Monitor.getBounds();monitor.getClientArea(),用于获取边界和客户区。
多线程同步:Display维护一个自定义的事件队列,供后台线程与UI线程同步,后台线程利用Runalble对象插入事件队列,display执行消息循环时就会执行这些操作,Display提供了两个方法向队列中插入事件:

Display.syncExec(),Display.asyncExec()。前者同步调用,通知UI在下一个事件循环时执行Runalble的run方法,同时线程将被阻塞,直到runable执行完毕,后者为异步调用,区别是线程不会被阻塞,runable执行完毕后不会得到通知。

public static void main(String[] args) {
        final Display display = new Display();
        Shell shell = new Shell(display);
        shell.setText("Hello world!");
        final Button button = new Button(shell, SWT.NONE);
        button.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                Thread thread = new Thread() {
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(10000);//代表大量运算
                        } catch (Exception e2) {
                            // TODO: handle exception
                        }
                        display.syncExec(new Runnable() {
                            @Override
                            public void run() {
                                button.setText("finish");//运算完毕,提示通知
                            }
                        });
                    }
                };
                thread.start();
            }
        });
        button.setText("button");
        button.setBounds(20, 15, 155, 25);

        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 常用的网络
  • Netty 5用户指南
  • netty 学习 (4)混合使用coder和handler
  • netty 学习 (3)发送对象
  • netty 学习 (2)Handler的执行顺序
  • netty 学习 (1)
  • Java设计模式——工厂设计模式
  • Java开发中的23种设计模式详解(转)
  • CMMI学习
  • NetConf协议说明
  • HashMap 与 ConcurrentHashMap
  • java-策略模式
  • SNMP4J简介
  • SNMP 使用SNMP4J V2进行TRAP
  • JTable的清空小技巧以及JTable的详细介绍
  • #Java异常处理
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • angular2开源库收集
  • extjs4学习之配置
  • java2019面试题北京
  • October CMS - 快速入门 9 Images And Galleries
  • tab.js分享及浏览器兼容性问题汇总
  • yii2权限控制rbac之rule详细讲解
  • 多线程 start 和 run 方法到底有什么区别?
  • 免费小说阅读小程序
  • 少走弯路,给Java 1~5 年程序员的建议
  • 怎样选择前端框架
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​比特币大跌的 2 个原因
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (10)STL算法之搜索(二) 二分查找
  • (24)(24.1) FPV和仿真的机载OSD(三)
  • (4)STL算法之比较
  • (5)STL算法之复制
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (排序详解之 堆排序)
  • (转) Face-Resources
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)http协议
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .htaccess配置重写url引擎
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .Net 6.0 处理跨域的方式
  • .NET 8.0 中有哪些新的变化?
  • .net core 管理用户机密