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

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

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

    大夢想家

    5年開發(fā)工程師,2年實(shí)施經(jīng)理,X年售前顧問,......
    數(shù)據(jù)加載中……
    JFace進(jìn)度條使用經(jīng)驗(yàn)一則

        我討論的進(jìn)度條主要是JFace的進(jìn)度條,RCP已經(jīng)提供了完善的Job組件,為什么還要用JFace的進(jìn)度條呢?原因是我要在登陸界面上做進(jìn)度處理,也就是使用Eclipse3.3提供的AbstractSplashHandler特性,可以將原有的啟動畫面替換成為一個登陸界面,啟動這個登陸界面時,Eclipse的Platform此時還沒有啟動,所以不能使用RCP本身的Job組件了。

        由于是一個檢測服務(wù)器是否聯(lián)通的測試,所以并不知道測試的真實(shí)時間,所以就是要使用“傻瓜進(jìn)度條”了,也就是反復(fù)走的進(jìn)度條陳剛的代碼如下:

    button.addSelectionListener(new SelectionAdapter() {
                private boolean stopFlag;// 停止標(biāo)志

                private void go() {
                    for (int i = 0; i < 10; i++) {// 循環(huán)10次,每次間隔一秒
                        System.out.println("第" + (i + 1) + "個任務(wù)執(zhí)行完畢");
                        if (stopFlag) {// 監(jiān)控是否要讓停止后臺任務(wù)
                            System.out.println("被中斷了");
                            return;
                        }
                        try {
                            Thread.sleep(1000);
                        } catch (Throwable t) {}
                    }
                    stopFlag = true;// 執(zhí)行完畢后把標(biāo)志位設(shè)為停止,好通知給進(jìn)度框
                    System.out.println("全部任務(wù)執(zhí)行完畢");
                }

                public void widgetSelected(SelectionEvent e) {
                    stopFlag = false;// 每次都設(shè)初值為false
                    new Thread() {// 把后臺任務(wù)放到一個新開線程里執(zhí)行
                        public void run() {
                            go();
                        }
                    }.start();
                    showProgressDialog();// 打開一個進(jìn)度框
                }

                private void showProgressDialog() {
                    IRunnableWithProgress runnable = new IRunnableWithProgress() {
                        public void run(IProgressMonitor monitor) {
                            monitor.beginTask("正在執(zhí)行中......", 30);
                            int i = 0;
                            while (true) {
                                // 監(jiān)聽是否單擊了進(jìn)度框的“取消”按鈕,stopFlag則是監(jiān)聽后臺任務(wù)是否停止
                                if (monitor.isCanceled() || stopFlag) {
                                    stopFlag = true; // 單擊了“取消”按鈕要設(shè)標(biāo)志位為停止,好通知后臺任務(wù)中斷執(zhí)行
                                    break;// 中斷處理
                                }
                                // i到30后清零。并將進(jìn)度條重新來過
                                if ((++i) == 30) {
                                    i = 0;
                                    monitor.beginTask("正在執(zhí)行中......", 30);
                                }
                                // 進(jìn)度條每前進(jìn)一步體息一會,不用太長或太短,時間可任意設(shè)。
                                try {
                                    Thread.sleep(99);
                                } catch (Throwable t) {}
                                monitor.worked(1);// 進(jìn)度條前進(jìn)一步
                            }
                            monitor.done();// 進(jìn)度條前進(jìn)到完成
                        }
                    };
                    try {
                        new ProgressMonitorDialog(s).run(true, true, runnable);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });

     

        主要是使用兩個線程交替使用,第一個線程處理業(yè)務(wù),第二個線程監(jiān)控第一個線程查看它是否結(jié)束,如果結(jié)束或者被點(diǎn)擊cancele則停止進(jìn)度條的進(jìn)程,如果一直沒有關(guān)閉的指令,則反復(fù)開始---累加---結(jié)束---開始---累加---結(jié)束。

        我們幾乎是把陳剛的代碼原原本本的抄襲了一下,僅僅是替換了go()中的內(nèi)容,但是發(fā)現(xiàn)一個問題

    new ProgressMonitorDialog(s).run(true, true, runnable);
    使用此句的話,JFace的線程永遠(yuǎn)不會啟動;

    替換為

    new ProgressMonitorDialog(s).run(false, true, runnable);
    使用此句的話,JFace的線程可以啟動,運(yùn)行正常,但是cancele不能響應(yīng),UI界面完全卡死!

        第一個參數(shù)的名字fork~乍看去,什么意思都沒有,但是看看API才發(fā)現(xiàn)內(nèi)藏很大的玄機(jī),如果為true則此線程為一個非UI線程,大家知道非UI線程是不會阻塞UI的;如果為false則此線程為一個UI線程,大家也知道UI線程如果使用不當(dāng)很容易阻塞UI的。

        關(guān)鍵的問題是我們和陳剛的代碼幾乎一摸一樣他的進(jìn)度條就啟動,我的進(jìn)度條就不啟動!為什么?(這點(diǎn)至今不明白!)

        詳查API發(fā)現(xiàn)如果fork為false的時候還是另有洞天的:

    This implementation of IRunnableContext#run(boolean, boolean, IRunnableWithProgress) runs the given IRunnableWithProgress using the progress monitor for this progress dialog and blocks until the runnable has been run, regardless of the value of fork. The dialog is opened before the runnable is run, and closed after it completes. It is recommended that fork is set to true in most cases. If fork is set to false, the runnable will run in the UI thread and it is the runnable's responsibility to call Display.readAndDispatch() to ensure UI responsiveness.

    API中說的很明白,如果fork為false時需要在線程中調(diào)用Display.readAndDispatch()方法,以避免UI被阻塞!

    大家如果在JFace的開發(fā)中如果使用了進(jìn)度條,發(fā)現(xiàn)UI被阻塞的話,就想想我哦!!!呵呵只用在進(jìn)程中調(diào)用一下Display.readAndDispatch()就解決了!



    客戶虐我千百遍,我待客戶如初戀!

    posted on 2008-02-29 08:47 阿南 閱讀(3824) 評論(6)  編輯  收藏 所屬分類: Eclipse-SWT個人原創(chuàng)

    評論

    # re: JFace進(jìn)度條使用經(jīng)驗(yàn)一則 2008-02-29 10:12 香草的天空

    這一點(diǎn)和win32api很像
      回復(fù)  更多評論    

    # re: JFace進(jìn)度條使用經(jīng)驗(yàn)一則 2008-02-29 13:43 Matthew Chen

    我把你的代碼拷過來,用new ProgressMonitorDialog(s).run(true, true, runnable); 好像可以用啊,進(jìn)度條走了幾次就停下來,cancel也可以,沒出什么問題啊,我用swt3.3
      回復(fù)  更多評論    

    # re: JFace進(jìn)度條使用經(jīng)驗(yàn)一則 2008-02-29 17:26 阿南

    首先我上面貼的代碼是沒有問題的!
    其次多看幾遍
    “我討論的進(jìn)度條主要是JFace的進(jìn)度條,RCP已經(jīng)提供了完善的Job組件,為什么還要用JFace的進(jìn)度條呢?原因是我要在登陸界面上做進(jìn)度處理,也就是使用Eclipse3.3提供的AbstractSplashHandler特性,可以將原有的啟動畫面替換成為一個登陸界面,啟動這個登陸界面時,Eclipse的Platform此時還沒有啟動,所以不能使用RCP本身的Job組件了。”
      回復(fù)  更多評論    

    # re: JFace進(jìn)度條使用經(jīng)驗(yàn)一則 2008-03-01 10:01 pice

    在go()方法中你用一個for循環(huán)來假設(shè)正在執(zhí)行的業(yè)務(wù)調(diào)用,如果go方法中就一個方法調(diào)用,但是這個方法執(zhí)行時間比較長。private void go() {
    dbSelectList();//查詢數(shù)據(jù)庫,查詢時間大約10秒
    stopFlag = true;// 執(zhí)行完畢后把標(biāo)志位設(shè)為停止,好通知給進(jìn)度框
    System.out.println("全部任務(wù)執(zhí)行完畢");
    }
    這時進(jìn)度條的cancel按鈕就不起作用了,不管是否點(diǎn)擊cancel按鈕dbSelectList()方法都將執(zhí)行完畢后進(jìn)度條才注銷。就算是重寫進(jìn)度條的cancelPressed()方法關(guān)閉UI線程使得進(jìn)度條界面“消失”,但是dbSelectList()方法還是會繼續(xù)執(zhí)行完。
    進(jìn)度條能應(yīng)對這樣的情況嗎?
      回復(fù)  更多評論    

    # re: JFace進(jìn)度條使用經(jīng)驗(yàn)一則 2008-03-02 14:46 xifu

    比javascript簡約啊
      回復(fù)  更多評論    

    # re: JFace進(jìn)度條使用經(jīng)驗(yàn)一則 2010-05-09 10:38 靈均

    做個手機(jī)收發(fā)短信軟件
      回復(fù)  更多評論    
    主站蜘蛛池模板: 91精品免费在线观看| 亚洲乱码国产一区网址| a级片在线免费看| 午夜无码A级毛片免费视频| 日韩精品无码人妻免费视频| 四虎影视在线影院在线观看免费视频 | 精品久久久久成人码免费动漫| 一级毛片免费播放视频| 亚洲最大福利视频| 亚洲国产美女精品久久久久∴| 国产精品免费看香蕉| 无码一区二区三区AV免费| 1000部夫妻午夜免费 | 国产亚洲精品影视在线产品| 国产精品二区三区免费播放心| 嘿嘿嘿视频免费网站在线观看| 免费h视频在线观看| 99久久免费国产精精品| 人妻无码中文字幕免费视频蜜桃 | 24小时在线免费视频| 国产精品免费福利久久| 久久精品免费网站网| caoporn成人免费公开| 免费看内射乌克兰女| 国产精品亚洲天堂| 国产午夜亚洲精品不卡电影| 噜噜综合亚洲AV中文无码| 中文字幕在线日亚洲9| 亚洲精品中文字幕无码AV| 亚洲视频免费在线看| 337P日本欧洲亚洲大胆精品| 亚洲国产精品成人久久蜜臀| 免费在线观看的黄色网址| 亚洲狠狠爱综合影院婷婷| 亚洲国产精品成人一区| 亚洲精品无码久久毛片| 亚洲色精品vr一区二区三区 | 男人扒开添女人下部免费视频| 理论亚洲区美一区二区三区| 国产综合激情在线亚洲第一页| 美女被免费网站视频在线|