在应用程序中运行外部进程时,启动画面中的SWT / JFACE进度条停止更新

时间:2013-11-30 09:17:40

标签: swt jface

我在初始化期间使用progrss栏调用启动画面的应用程序有问题,这是我的应用程序内部代码的一部分,

try {
            Runtime runTime = Runtime.getRuntime();
            pbaw = runTime.exec(cmdGen);
            //pbaw = probuilder.start();
            try {
                String line;
                BufferedReader input =
                        new BufferedReader(new InputStreamReader(pbaw.getInputStream()));
                SplashScreen ss= new SplashScreen(Display.getCurrent(), getShell());
                int progress = 0;
                ss.show();
                while ((line = input.readLine()) != null) {
                    ss.setLabel(line);
                    progress+=1;
                    ss.advance(progress);
                    //System.out.println(line); //<-- Parse data here.
                }
                input.close();
                ss.destroy(pbaw.waitFor());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

我的问题是为什么当我点击桌面或运行其他应用程序时,启动画面中的程序栏无法更新,但我的应用程序可以完美运行,请帮助??? 这里是我的泼溅scrren代码的一部分,以明确,

void advance(final int progress) {
                if (!progressBar.isDisposed()) {
                    progressBar.setSelection(progress);//progressBar.getSelection() + progress);
                    progressBar.redraw();
                }
            }

            public void show() {
                mainShell.pack();
                mainShell.open();

            }

            void destroy(int val) {
                if (val==0){
                    splashComposite.dispose();
                    if (appImage != null) {
                        appImage.dispose();
                    }
                    mainShell.dispose();
                }
            }

1 个答案:

答案 0 :(得分:1)

您正在用户界面线程中运行代码,并且永远不会让SWT有机会进行更新。您需要在单独的线程中运行您的阅读代码,并使用Display.asyncExec更新UI线程中的初始屏幕。