java – 使用syncExec()的SWT问题
这是我在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所花费的时间并且它是常量,但是当我分析这一行时sSeh??ll.getDisplay().syncExec(progress)需要不同的时间(从0ms到XXXXms) 我读过这个
但是Runnable是时间常数…… 有人可以指导我吗?我不明白为什么有时需要3分钟和其他时间. 谢谢 解决方法
SWT Display类中有两种方法,syncExec和aSyncExec.当你的线程不是想要以某种方式更新UI的UI线程时,它们都被使用.基本上当你打电话给他们时,你基本上是对UI线程说,当你有机会时,你想要它做的事情.因此,UI线程将继续其当前的工作,并且在某些时候它将执行您要求它执行的操作.当它发生时,它总是会有所不同,具体取决于UI线程当时必须做的其他工作.
aSyncExec和syncExec之间的区别在于调用它的代码是否等待执行完成.如果调用aSyncExec,则会立即执行调用线程中的下一个语句.如果你调用syncExec,那么你的调用线程将一直等到UI线程实际执行代码并返回.通过计算执行syncExec所需的时间,您不仅可以计算运行方法执行的时间,还可以计算UI线程开始运行它的时间. 不要试图在这里将syncExec与aSyncExec交换.如果你花费aSyncExec执行多长时间,你会发现它更快.但那是因为所有你的时间都是告诉UI线程你需要做多少事情所花费的时间(不需要花多长时间). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |