这是关于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分钟和其他时间。
由于
答案 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 documentation,syncExec
:
导致run()方法 runnable可以被调用 用户界面线程在下一个 合理的机会。线程 调用此方法的方法被暂停 直到runnable完成。 将null指定为runnable 简单地唤醒用户界面 线程。
因此,您的run
方法在固定时间内运行,但Display
对象可能并不总是立即调用它。