<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    FORTUNE

    THE WAY TO THE MASTER...
    posts - 49, comments - 18, trackbacks - 0, articles - 1
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    SWT和多線程結合使用的問題釋疑

    Posted on 2006-02-21 13:42 fortune 閱讀(746) 評論(0)  編輯  收藏 所屬分類: java技術

    SWT作為JAVA開源世界的優秀圖形庫,已經得到了很多java愛好者的青睞。我最近也在使用swt開發一些應用程序。我發現多線程中使用swt需要額外的技巧。

    情形:
        單擊一個按鈕,然后新開一個線程來執行一個復雜的任務。任務執行完時,彈出一個對話框提示任務執行完畢。

    示例1:

    package threadandui;

    import org.eclipse.swt.SWT;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.MessageBox;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.swt.widgets.Button;
    import org.eclipse.swt.events.SelectionAdapter;
    import org.eclipse.swt.events.SelectionEvent;

    public class TestSwt1 extends Shell {
            public static Shell shell;
            public static void main(String args[]) {
                    try {
                            Display display = Display.getDefault();
                            shell = new TestSwt1(display, SWT.SHELL_TRIM);
                            shell.open();
                            shell.layout();
                            while (!shell.isDisposed()) {
                                    if (!display.readAndDispatch())
                                            display.sleep();
                            }
                    } catch (Exception e) {
                            e.printStackTrace();
                    }
            }

            public TestSwt1(Display display, int style) {
                    super(display, style);
                    createContents();
            }

            protected void createContents() {
                    setText("SWT Application1");
                    setSize(500, 375);

                    final Button button = new Button(this, SWT.NONE);
                    button.addSelectionListener(new SelectionAdapter() {
                            public void widgetSelected(SelectionEvent e) {
                                    new MyThread().start();
                            }
                    });
                    button.setBounds(80, 50, 85, 25);
                    button.setText("start");
            }

            protected void checkSubclass() {
            }
            
            class MyThread extends Thread{
                    public void run(){
                            //complex task
    //                        for(int i=0;i < 10000;i++){
    //                                System.out.println(i);
    //                        }
                            //display a dialog                         
                            MessageBox mb = new MessageBox(shell);
                            mb.setMessage("Task ended!");
                            mb.open();
                    }
            }
    }

    該程序在單擊start按鈕后會有異常:
    Exception in thread "Thread-0" org.eclipse.swt.SWTException: Invalid thread access
            at org.eclipse.swt.SWT.error(SWT.java:2691)
            at org.eclipse.swt.SWT.error(SWT.java:2616)
            at org.eclipse.swt.SWT.error(SWT.java:2587)
            at org.eclipse.swt.widgets.Widget.error(Widget.java:381)
            at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:284)
            at org.eclipse.swt.widgets.Dialog.checkParent(Dialog.java:154)
            at org.eclipse.swt.widgets.Dialog.<init>(Dialog.java:116)
            at org.eclipse.swt.widgets.MessageBox.<init>(MessageBox.java:81)
            at org.eclipse.swt.widgets.MessageBox.<init>(MessageBox.java:54)
            at threadandui.TestSwt1$MyThread.run(TestSwt1.java:70)

    為什么會有異常?沒有參考書,沒有人指導,你是就此罷休呢,還是刨根問底?我想知道答案,那我該怎么做呢?
    請注意,swt是開源的,代碼就是你最好的參考書,最好的指導老師!

    查看swt源代碼:at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:284)

    /*245*/        protected void checkWidget () {
            
    /*246*/                Display display = this.display;
            
    /*247*/                if (display == null) error (SWT.ERROR_WIDGET_DISPOSED);
            
    /*248*/                if (display.thread != Thread.currentThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS);
            
    /*249*/                if ((state & DISPOSED) != 0) error (SWT.ERROR_WIDGET_DISPOSED);

    /*250*/        }
    第248行有判斷“display.thread != Thread.currentThread ()”。顯然,在我們的示例中他們是不相等的。因為,MessageBox處在新創建的線程中,而display

    則處在main線程中。可見我們需要在新線程中創建一個display給MessageBox使用。“示例2”給出了答案。


    示例2;
    /*
    * Created on 2005-5-26
    *
    * TODO To change the template for this generated file go to
    * Window - Preferences - Java - Code Style - Code Templates
    */
    package threadandui;

    import org.eclipse.swt.SWT;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.MessageBox;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.swt.widgets.Button;
    import org.eclipse.swt.events.SelectionAdapter;
    import org.eclipse.swt.events.SelectionEvent;

    /**
    * @author jiangjunping
    *
    * TODO To change the template for this generated type comment go to
    * Window - Preferences - Java - Code Style - Code Templates
    */
    public class TestSwt2 extends Shell {
            public static Shell shell;
            public static void main(String args[]) {
                    try {
                            Display display = Display.getDefault();
                            shell = new TestSwt2(display, SWT.SHELL_TRIM);
                            shell.open();
                            shell.layout();
                            while (!shell.isDisposed()) {
                                    if (!display.readAndDispatch())
                                            display.sleep();
                            }
                    } catch (Exception e) {
                            e.printStackTrace();
                    }
            }

            public TestSwt2(Display display, int style) {
                    super(display, style);
                    createContents();
            }

            protected void createContents() {
                    setText("SWT Application2");
                    setSize(500, 375);

                    final Button button = new Button(this, SWT.NONE);
                    button.addSelectionListener(new SelectionAdapter() {
                            public void widgetSelected(SelectionEvent e) {
                                    new MyThread().start();
                            }
                    });
                    button.setBounds(80, 50, 85, 25);
                    button.setText("start");
                    //
            }

            protected void checkSubclass() {
            }
            
            class MyThread extends Thread{
                    public void run(){
                            //complex task
                            for(int i=0;i < 50000;i++){
                                    System.out.println(i);
                            }
                            //display a dialog                         
                            Display display = new Display();//new display
                            Shell shell2 = new Shell(display);//added 
                            MessageBox mb = new MessageBox(shell2);//use new display created in the current thread
                            mb.setMessage("Task ended!");
                            mb.open();
                            display.dispose();//added
                    }
            }
    }


    好了,程序正常了!

    主站蜘蛛池模板: 国产V亚洲V天堂无码| 最近2019中文字幕免费看最新| 亚洲A∨无码无在线观看| 一边摸一边桶一边脱免费视频| 国产日产成人免费视频在线观看| 国产AV旡码专区亚洲AV苍井空| 在线视频精品免费| 亚洲制服丝袜第一页| 久久久久免费看黄A片APP| 亚洲精品午夜国产va久久| 日本特黄特色aa大片免费| 亚洲精品夜夜夜妓女网| 一本色道久久88亚洲精品综合 | 免费无码又爽又刺激一高潮| 在线A亚洲老鸭窝天堂| 久久精品乱子伦免费| 亚洲美女自拍视频| 麻豆成人精品国产免费| 无遮挡呻吟娇喘视频免费播放| 亚洲国产成人久久综合碰| 成全视成人免费观看在线看| 国产精品国产午夜免费福利看 | 亚洲国产成人精品无码区花野真一 | 国产美女无遮挡免费视频网站| 久久久www成人免费毛片| 国产精品亚洲四区在线观看| 国产在线观看免费不卡| 一日本道a高清免费播放| 久久久久久亚洲Av无码精品专口| 青青青国产在线观看免费网站 | 亚洲AV无码男人的天堂| 亚洲午夜福利精品久久| 日韩免费高清大片在线| 亚洲色少妇熟女11p| 亚洲区不卡顿区在线观看| 久久免费福利视频| 欧洲亚洲综合一区二区三区| 毛片a级毛片免费观看品善网| 特级av毛片免费观看| 亚洲精品无码不卡| 免费国产成人午夜私人影视|