syncExec()的SWT问题

时间:2010-03-04 13:11:58

标签: java swt agents-jade

这是关于StackOverflow的第一个问题(对不起我的英文)。我会尝试解释这个问题。

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

if(Display.getCurrent() != null) {
    progress.run();
}
else {
   sShell.getDisplay().syncExec(progress);
}

进展是:

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);
        }    
    }
};

我尝试分析此Runnable所用的时间并且它是常量,但是当我分析此行时sSehll.getDisplay().syncExec(progress)需要不同的时间(从0ms到XXXXms)

我已经读过这个

  

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

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

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

由于

2 个答案:

答案 0 :(得分:3)

SWT Display类有两种方法,syncExec和aSyncExec。当你的线程不是想要以某种方式更新UI的UI线程时,它们都被使用。基本上当你打电话给他们时,你基本上是对UI线程说,当你有机会时,你想要它做的事情。因此,UI线程将继续其当前的工作,并且在某些时候它将执行您要求它执行的操作。当它发生时,它总是会有所不同,具体取决于UI线程当时必须做的其他工作。

aSyncExec和syncExec之间的区别在于调用它的代码是否等待执行完成。如果调用aSyncExec,则会立即执行调用线程中的下一个语句。如果你调用syncExec,那么你的调用线程将一直等到UI线程实际执行代码并返回。通过计算执行syncExec所需的时间,您不仅可以计算执行run方法所需的时间,还可以计算UI线程开始运行它的时间。

不要试图在这里将syncExec与aSyncExec交换。如果你花费aSyncExec执行多长时间,你会发现它更快。但这是因为你所要的时间是告诉UI线程你需要做多少事情所花费的时间(而不是花多长时间)。

答案 1 :(得分:1)

根据Display class documentationsyncExec

  

导致run()方法   runnable可以被调用   用户界面线程在下一个   合理的机会。线程   调用此方法的方法被暂停   直到runnable完成。   将null指定为runnable   简单地唤醒用户界面   线程。

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