syncExec()的SWT问题

Mic*_*hel 7 java swt agents-jade

这是我在StackOverflow上的第一个问题(抱歉我的英文).我会尽力解释这个问题.

我有一个带有前景玉应用程序的swt应用程序,其中我有一个进度条来通知应用程序的持续时间.要刷新此进度条,我使用:

if(Display.getCurrent() != null) {
    progress.run();
}
else {
   sShell.getDisplay().syncExec(progress);
}
Run Code Online (Sandbox Code Playgroud)

进展是:

Runnable progress = new Runnable() {
    public void run () {
        if (progressBar.isDisposed ()) 
            return;
        int percentage= (numStep*100)/maxSteps;
        progressBar.setSelection(percentage);
        if (numStep >= maxSteps){
            label1.setText("The simulation has been completed.");
            button.setEnabled(true);
        }    
    }
};
Run Code Online (Sandbox Code Playgroud)

我试着分析这个Runnable所花费的时间并且它是恒定的,但是当我分析这条线sSehll.getDisplay().syncExec(progress)需要不同的时间(从0ms到XXXXms)

我读过这个

syncExec(Runnable runnable)导致当前线程(如果它与显示器的用户界面线程不同)等待runnable完成.

但是Runnable是时间常数......

有人可以指导我吗?我不明白为什么有时需要3分钟和其他时间.

谢谢

Ada*_*ter 1

根据Display课程文档syncExec

导致用户界面线程在下一个合理的机会调用可运行对象的 run() 方法。调用此方法的线程将被挂起,直到可运行完成。指定 null 作为可运行对象只会唤醒用户界面线程。

因此,您的run方法在恒定时间内运行,但Display对象可能并不总是立即调用它。