SWT问题与syncExec()
这是我在StackOverflow上的第一个问题(抱歉我的英语)。 我会尽力解释这个问题。
我有一个前台玉石应用程序的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是时间不变的...
有人可以指导我吗? 我不明白为什么有时需要3分钟和其他时间。
谢谢
SWT Display类有两种方法,syncExec和aSyncExec。 当你有一个线程不是想要以某种方式更新UI的UI线程时,它们都会被使用。 基本上,当你给他们打电话时,你基本上是在向用户界面线索说,当你有机会的时候,你有它想做的事情。 所以UI线程将继续其当前的工作,并且在某个时候它将完成你要求它做的事情。 当它发生时,它会随着UI线程当时所做的其他工作而不同。
aSyncExec和syncExec之间的区别在于调用它的代码是否等待执行完成。 如果调用一个SyncExec,那么执行调用线程中的下一条语句将立即执行。 如果你调用syncExec,那么你的调用线程将会等待,直到UI线程实际执行代码并返回。 通过计算执行syncExec需要多长时间,您因此计算的不仅是执行run方法需要多长时间,还要计算UI线程有效开始运行需要多长时间。
不要试图在此处将syncExec与aSyncExec对换。 如果你花时间执行一次SyncExec需要多长时间,你会发现它更快。 但是,那是因为你所需的时间是告诉UI线程需要多长时间才能完成(不需要多长时间才能完成)。
根据Display
类文档, syncExec
:
导致runnable的run()方法在下一个合理的机会被用户界面线程调用。 调用此方法的线程将暂停,直到runnable完成。 将null指定为runnable只是唤醒用户界面线程。
因此,您的run
方法在恒定时间内运行,但Display
对象可能不会立即调用它。