首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

【转】SWT Designer 上 SWT的线程

2012-10-26 
【转】SWT Designer 下 SWT的线程多数情况下,GUI界面编程不需要考虑线程问题,SWT已经帮助我们隐藏了底层的线

【转】SWT Designer 下 SWT的线程

多数情况下,GUI界面编程不需要考虑线程问题,SWT已经帮助我们隐藏了底层的线程调用。但一些特殊应用,却不得不涉及SWT线程编程。
??????? 在实际项目开发中,一种常见的应用是:单击前台界面的执行后,在后台要做一些任务处理,任务执行情况要反映在界面上,而且还不能影响前台界面的其他操作
??????? 这种应用的实现思路如下:
前台界面和后台程序分开2个类。
为后台程序另开一个线程,这样就可以让前台操作不受后台影响了。
前台界面提供一些可操作的组件的方法,后台处理程序调用这些方法,将执行情况的字符串写到前台界面组件中。
??????? 这种思路必须解决一个关键问题:界面本身有一个默认线程,后台程序又是另外一个线程。那么该如何在一个线程中访问另外一个线程呢?
??????? (1) 为后台新开一个线程,这要用到JDK中线程的知识,代码如下:

【转】SWT Designer 上 SWT的线程????????new?Thread(){?//?新开一个线程,这是匿名内部类的写法
【转】SWT Designer 上 SWT的线程????????????public?void?run(){
【转】SWT Designer 上 SWT的线程????????????????//开始后台任务
【转】SWT Designer 上 SWT的线程????????????}
【转】SWT Designer 上 SWT的线程????????}.start();//start表示立即开始线程

????? (2) 从后台处理线程中访问前台界面组件,关键在于使用display对象,因为display主要负责管理时间循环和控制UI线程和其他线程之间的通信。display的具体使用方法如下:

【转】SWT Designer 上 SWT的线程????????Display.getDefault().asyncExec(new?Runnable(){//又是一个匿名内部类写法
【转】SWT Designer 上 SWT的线程????????????public?void?run(){
【转】SWT Designer 上 SWT的线程????????????????//对前台界面的操作
【转】SWT Designer 上 SWT的线程????????????}
【转】SWT Designer 上 SWT的线程????????});

????? 在这里的display对象很关键,因此顺便给出得到display对象的2种方法:
Display.getDefault(),得到一个默认的display对象,应用程序一般只需要一个display对象。
Display.getCurrent(),得到当前运行线程所在的display对象,如果生成2个以上的display对象,则可用此方法。?

  • 一个SWT线程的实例

    本实例分2个类:一个前台界面类,一个后台处理类。实例功能说明如下:
    ????? 单击“GO”按钮时,开始后台处理。
    ????? 单击“STOP”按钮,立即中断后台处理。
    ??????后台处理的任务数根据前台界面文本框的值来决定。
    ??????进度条将实时反映后台处理的进度。
    ??????底部的文本框将以文字形式反映后台处理的进度情况。
    ????? 实例具体代码如下:

    1. 前台界面类

    【转】SWT Designer 上 SWT的线程import?org.eclipse.swt.SWT;
    【转】SWT Designer 上 SWT的线程import?org.eclipse.swt.events.SelectionAdapter;
    【转】SWT Designer 上 SWT的线程import?org.eclipse.swt.events.SelectionEvent;
    【转】SWT Designer 上 SWT的线程import?org.eclipse.swt.events.VerifyEvent;
    【转】SWT Designer 上 SWT的线程import?org.eclipse.swt.events.VerifyListener;
    【转】SWT Designer 上 SWT的线程import?org.eclipse.swt.layout.GridData;
    【转】SWT Designer 上 SWT的线程import?org.eclipse.swt.layout.GridLayout;
    【转】SWT Designer 上 SWT的线程import?org.eclipse.swt.widgets.Button;
    【转】SWT Designer 上 SWT的线程import?org.eclipse.swt.widgets.Display;
    【转】SWT Designer 上 SWT的线程import?org.eclipse.swt.widgets.Group;
    【转】SWT Designer 上 SWT的线程import?org.eclipse.swt.widgets.Label;
    【转】SWT Designer 上 SWT的线程import?org.eclipse.swt.widgets.ProgressBar;
    【转】SWT Designer 上 SWT的线程import?org.eclipse.swt.widgets.Shell;
    【转】SWT Designer 上 SWT的线程import?org.eclipse.swt.widgets.Text;
    【转】SWT Designer 上 SWT的线程
    【转】SWT Designer 上 SWT的线程public?class?TaskGUI?{
    【转】SWT Designer 上 SWT的线程????private?Display?display?=?Display.getDefault();
    【转】SWT Designer 上 SWT的线程????private?Shell?shell?=?new?Shell();
    【转】SWT Designer 上 SWT的线程????private?Task?task?=?new?Task(this);//Task是后台处理类,需要传入一个TaskGUI类型参数
    【转】SWT Designer 上 SWT的线程????//将界面组件设为类的实例变量
    【转】SWT Designer 上 SWT的线程????private?Text?taskCountText;//可输入任务数的文本框
    【转】SWT Designer 上 SWT的线程????private?Button?startButton;//开始
    【转】SWT Designer 上 SWT的线程????private?Button?stopButton;//结束
    【转】SWT Designer 上 SWT的线程????private?ProgressBar?progressBar;//显示的任务条
    【转】SWT Designer 上 SWT的线程????private?Text?consoleText;//显示当前后台进度的信息条
    【转】SWT Designer 上 SWT的线程????//主函数
    【转】SWT Designer 上 SWT的线程????public?static?void?main(String[]?args){
    【转】SWT Designer 上 SWT的线程????????try{
    【转】SWT Designer 上 SWT的线程????????????TaskGUI?window?=?new?TaskGUI();
    【转】SWT Designer 上 SWT的线程????????????window.open();
    【转】SWT Designer 上 SWT的线程????????}catch(Exception?e){
    【转】SWT Designer 上 SWT的线程????????????e.printStackTrace();
    【转】SWT Designer 上 SWT的线程????????}
    【转】SWT Designer 上 SWT的线程????}
    【转】SWT Designer 上 SWT的线程????//前台页面的执行方法,显示出可操作的前台界面、
    【转】SWT Designer 上 SWT的线程????public?void?open()?{
    【转】SWT Designer 上 SWT的线程????????shell.setSize(300,300);
    【转】SWT Designer 上 SWT的线程????????shell.setLayout(new?GridLayout());
    【转】SWT Designer 上 SWT的线程????????Group?group?=?new?Group(shell,SWT.NONE);
    【转】SWT Designer 上 SWT的线程????????group.setLayoutData(new?GridData(GridData.FILL_HORIZONTAL));
    【转】SWT Designer 上 SWT的线程????????group.setLayout(new?GridLayout(4,false));
    【转】SWT Designer 上 SWT的线程????????
    【转】SWT Designer 上 SWT的线程????????new?Label(group,SWT.NONE).setText("taskCount:");
    【转】SWT Designer 上 SWT的线程????????taskCountText?=?new?Text(group,SWT.BORDER);
    【转】SWT Designer 上 SWT的线程????????taskCountText.setText("10");
    【转】SWT Designer 上 SWT的线程????????taskCountText.setLayoutData(new?GridData(100,-1));
    【转】SWT Designer 上 SWT的线程????????taskCountText.addVerifyListener(new?VerifyListener(){
    【转】SWT Designer 上 SWT的线程????????????public?void?verifyText(VerifyEvent?e)?{?//only?input?NO.
    【转】SWT Designer 上 SWT的线程????????????????e.doit?=?"0123456789".indexOf(e.text)>=0;????????????????
    【转】SWT Designer 上 SWT的线程????????????}????????????
    【转】SWT Designer 上 SWT的线程????????});
    【转】SWT Designer 上 SWT的线程????????startButton?=?new?Button(group,SWT.PUSH);
    【转】SWT Designer 上 SWT的线程????????startButton.setText("GO");
    【转】SWT Designer 上 SWT的线程????????startButton.addSelectionListener(new?SelectionAdapter()?{//点击开始按钮
    【转】SWT Designer 上 SWT的线程????????????public?void?widgetSelected(SelectionEvent?e)?{
    【转】SWT Designer 上 SWT的线程????????????????setButtonState(false);//点击后,2个Button发生变化
    【转】SWT Designer 上 SWT的线程????????????????//得到任务数,多线程使用的变量要求类型为final
    【转】SWT Designer 上 SWT的线程????????????????String?str?=?taskCountText.getText();
    【转】SWT Designer 上 SWT的线程????????????????final?int?taskCount?=?new?Integer(str).intValue();
    【转】SWT Designer 上 SWT的线程????????????????//设置进度条的格数
    【转】SWT Designer 上 SWT的线程????????????????progressBar.setMaximum(taskCount-1);
    【转】SWT Designer 上 SWT的线程????????????????consoleText.insert("back?Thread?run?start...?...?????????????????//为后台新开一个线程,运行,当run方法结束(即后台的start()结束),线程自动销毁
    【转】SWT Designer 上 SWT的线程????????????????new?Thread(){
    【转】SWT Designer 上 SWT的线程????????????????????public?void?run(){
    【转】SWT Designer 上 SWT的线程????????????????????????task.start(taskCount);
    【转】SWT Designer 上 SWT的线程????????????????????}
    【转】SWT Designer 上 SWT的线程????????????????}.start();
    【转】SWT Designer 上 SWT的线程????????????????consoleText.insert("back?Thread?run?end...?...?????????????}
    【转】SWT Designer 上 SWT的线程????????});
    【转】SWT Designer 上 SWT的线程????????stopButton?=?new?Button(group,SWT.PUSH);
    【转】SWT Designer 上 SWT的线程????????stopButton.setText("STOP");
    【转】SWT Designer 上 SWT的线程????????stopButton.setEnabled(false);????????
    【转】SWT Designer 上 SWT的线程????????stopButton.addSelectionListener(new?SelectionAdapter()?{
    【转】SWT Designer 上 SWT的线程????????????public?void?widgetSelected(SelectionEvent?e)?{
    【转】SWT Designer 上 SWT的线程????????????????task.stop();//后台执行stop方法,实际是要后台任务停止
    【转】SWT Designer 上 SWT的线程????????????}
    【转】SWT Designer 上 SWT的线程????????});
    【转】SWT Designer 上 SWT的线程????????progressBar?=?new?ProgressBar(shell,SWT.NONE);
    【转】SWT Designer 上 SWT的线程????????progressBar.setLayoutData(new?GridData(GridData.FILL_HORIZONTAL));
    【转】SWT Designer 上 SWT的线程????????//下面2个是设置,文本框的显示格式,第2行的如果不加则会看不到全部信息了
    【转】SWT Designer 上 SWT的线程????????consoleText?=?new?Text(shell,SWT.MULTI|SWT.BORDER|SWT.V_SCROLL);
    【转】SWT Designer 上 SWT的线程????????consoleText.setLayoutData(new?GridData(GridData.FILL_BOTH));
    【转】SWT Designer 上 SWT的线程????????shell.layout();
    【转】SWT Designer 上 SWT的线程????????shell.open();
    【转】SWT Designer 上 SWT的线程????????while(!shell.isDisposed()){
    【转】SWT Designer 上 SWT的线程????????????if(!display.readAndDispatch()){
    【转】SWT Designer 上 SWT的线程????????????????display.sleep();
    【转】SWT Designer 上 SWT的线程????????????}
    【转】SWT Designer 上 SWT的线程????????}
    【转】SWT Designer 上 SWT的线程????}
    【转】SWT Designer 上 SWT的线程????public?void?setButtonState(boolean?bFlag){//设置页面的2个按钮状态
    【转】SWT Designer 上 SWT的线程????????startButton.setEnabled(bFlag);
    【转】SWT Designer 上 SWT的线程????????stopButton.setEnabled(!bFlag);
    【转】SWT Designer 上 SWT的线程????}
    【转】SWT Designer 上 SWT的线程????//为后台取得页面组件写的几个GET方法
    【转】SWT Designer 上 SWT的线程????public?Shell?getShell(){
    【转】SWT Designer 上 SWT的线程????????return?shell;
    【转】SWT Designer 上 SWT的线程????}????
    【转】SWT Designer 上 SWT的线程????public?Text?getConsoleText(){
    【转】SWT Designer 上 SWT的线程????????return?consoleText;
    【转】SWT Designer 上 SWT的线程????}????
    【转】SWT Designer 上 SWT的线程????public?ProgressBar?getProgressBar(){
    【转】SWT Designer 上 SWT的线程????????return?progressBar;
    【转】SWT Designer 上 SWT的线程????}
    【转】SWT Designer 上 SWT的线程}

    ?2. 后台任务类

    【转】SWT Designer 上 SWT的线程import?org.eclipse.swt.widgets.Display;
    【转】SWT Designer 上 SWT的线程public?class?Task?{
    【转】SWT Designer 上 SWT的线程????private?TaskGUI?gui;//通过构造器得到前台界面对象
    【转】SWT Designer 上 SWT的线程????private?boolean?stopFlag;//是否停止的标志
    【转】SWT Designer 上 SWT的线程????//构造器?取得前台界面对象
    【转】SWT Designer 上 SWT的线程????public?Task(TaskGUI?taskGUI){
    【转】SWT Designer 上 SWT的线程????????this.gui?=?taskGUI;
    【转】SWT Designer 上 SWT的线程????}????
    【转】SWT Designer 上 SWT的线程????public?void?stop(){
    【转】SWT Designer 上 SWT的线程????????stopFlag?=?true;
    【转】SWT Designer 上 SWT的线程????}
    【转】SWT Designer 上 SWT的线程????//就是前台run方法的执行内容,这个方法结束,则前台new的那个线程销毁
    【转】SWT Designer 上 SWT的线程????public?void?start(int?taskCount){
    【转】SWT Designer 上 SWT的线程????????stopFlag?=?false;//将执行状态初始化执行
    【转】SWT Designer 上 SWT的线程????????insertConsoleText("backGO?start?...?...?????????for(int?i=0;i<taskCount;i++){
    【转】SWT Designer 上 SWT的线程????????????if(stopFlag){//点击stop按钮则这个属性为true,跳出循环
    【转】SWT Designer 上 SWT的线程????????????????break;
    【转】SWT Designer 上 SWT的线程????????????}
    【转】SWT Designer 上 SWT的线程????????????try{//每隔1秒一次循环
    【转】SWT Designer 上 SWT的线程????????????????Thread.sleep(1000);
    【转】SWT Designer 上 SWT的线程????????????}catch(InterruptedException?e){
    【转】SWT Designer 上 SWT的线程????????????????e.printStackTrace();
    【转】SWT Designer 上 SWT的线程????????????}
    【转】SWT Designer 上 SWT的线程????????????//页面上的信息累加
    【转】SWT Designer 上 SWT的线程????????????insertConsoleText("task"+(i+1)+"the?end????????????//移动进度条的进度
    【转】SWT Designer 上 SWT的线程????????????moveProgressBar(i);
    【转】SWT Designer 上 SWT的线程????????}
    【转】SWT Designer 上 SWT的线程????????insertConsoleText("the?thread?end?of?the?task!!????????setTaskGUIButtonState(true);
    【转】SWT Designer 上 SWT的线程????}
    【转】SWT Designer 上 SWT的线程????//修改页面按钮的状态
    【转】SWT Designer 上 SWT的线程????private?void?setTaskGUIButtonState(final?boolean?bFlag){
    【转】SWT Designer 上 SWT的线程????????Display.getDefault().asyncExec(new?Runnable(){
    【转】SWT Designer 上 SWT的线程???????????public?void?run(){
    【转】SWT Designer 上 SWT的线程???????????????gui.setButtonState(bFlag);
    【转】SWT Designer 上 SWT的线程???????????}
    【转】SWT Designer 上 SWT的线程????????});
    【转】SWT Designer 上 SWT的线程????}????
    【转】SWT Designer 上 SWT的线程????private?void?moveProgressBar(final?int?progress){
    【转】SWT Designer 上 SWT的线程????????Display.getDefault().asyncExec(new?Runnable(){
    【转】SWT Designer 上 SWT的线程????????????public?void?run(){
    【转】SWT Designer 上 SWT的线程????????????????gui.getProgressBar().setSelection(progress);
    【转】SWT Designer 上 SWT的线程????????????}
    【转】SWT Designer 上 SWT的线程?????????});
    【转】SWT Designer 上 SWT的线程????}????
    【转】SWT Designer 上 SWT的线程????private?void?insertConsoleText(final?String?str){
    【转】SWT Designer 上 SWT的线程????????Display.getDefault().asyncExec(new?Runnable(){
    【转】SWT Designer 上 SWT的线程????????????public?void?run(){
    【转】SWT Designer 上 SWT的线程????????????????gui.getConsoleText().insert(str);
    【转】SWT Designer 上 SWT的线程????????????}
    【转】SWT Designer 上 SWT的线程?????????});
    【转】SWT Designer 上 SWT的线程????}????
    【转】SWT Designer 上 SWT的线程}

    ?程序说明:
    从上面代码的执行结果可以看到,前台new 了一个新的 thread 后,后面的那句文本依然可以输出,可以明确的说明,new了一个线程后,前台,后台线程是互补干扰的独自运行。当start方法结束时,后台的线程就自动销毁。

热点排行