Java syncExec()的SWT问题
这是我关于StackOverflow的第一个问题(对不起我的英语)。我会尽力解释这个问题 我有一个swt应用程序和一个前台jade应用程序,其中我有一个进度条来通知应用程序的持续时间。要刷新此进度条,我使用:Java syncExec()的SWT问题,java,swt,agents-jade,Java,Swt,Agents Jade,这是我关于StackOverflow的第一个问题(对不起我的英语)。我会尽力解释这个问题 我有一个swt应用程序和一个前台jade应用程序,其中我有一个进度条来通知应用程序的持续时间。要刷新此进度条,我使用: if(Display.getCurrent() != null) { progress.run(); } else { sShell.getDisplay().syncExec(progress); } 进展情况如下: Runnable progress = new Run
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)
所花费的时间不同(从0毫秒到xxms)
我读过这个
syncExec(Runnable Runnable)使当前线程(如果它与显示器的用户界面线程不同)等待Runnable完成
但可运行的是时间常数
有人能指引我吗?我不明白为什么有时候要花3分钟和其他时间
谢谢根据,syncExec
:
导致的run()方法
可由
用户界面线程在下一个
合理的机会。线
调用此方法的已挂起
直到runnable完成。
将null指定为可运行
只需唤醒用户界面
线
因此,您的
run
方法以固定时间运行,但是Display
对象可能并不总是立即调用它。SWT Display类中有两个方法,syncExec和asynceec。当您有一个线程不是希望以某种方式更新UI的UI线程时,它们都会被使用。基本上,当你给他们打电话时,你基本上是在对UI线程说,当它有机会的时候,你有你想要它做的事情。因此,UI线程将继续当前的工作,并在某个时候执行您要求它执行的操作。当它这样做时,它总是会根据UI线程当时必须做的其他工作而变化
aSyncExec和syncExec之间的区别在于调用它的代码是否等待执行完成。如果调用aSyncExec,那么调用线程中的下一条语句将立即执行。如果调用syncExec,那么调用线程将等待UI线程实际执行代码并返回。因此,通过计时执行syncExec所需的时间,不仅可以计时run方法执行所需的时间,还可以计时UI线程实际开始运行它所需的时间
不要试图在这里将syncExec与aSyncExec交换。如果您计算aSyncExec执行所需的时间,您会发现它甚至更快。但这是因为你所要计时的只是告诉UI线程你有事情要做需要多长时间(而不是需要多长时间)。+1,欢迎来到StackOverflow!我已经为你重新格式化了你的代码,但是没有必要为你的英语道歉:)谢谢你。我很久以前就知道这一点,但今天终于有人鼓励我参与。我记得当我阅读文档时,没有办法强迫我这么做?如果你让syncExec花三分钟,那么你可能会在SWT线程中执行代码,这应该放在后台线程中。这样做可以让UI再次平稳运行。但是没有办法以中间方式执行它?没有。它应该执行得非常快,除非您的UI线程正在做大量工作(如果是这种情况,您可能希望查看它正在做什么,并尝试在不同的线程中工作)。如果这真的需要3分钟,那么我猜你的UI线程正在做其他事情?它正在做的是与UI相关的工作吗?然后,该工作将必须留在主UI线程中,并且任何其他对此线程的请求都必须等待轮到它们。