java – 使用syncExec()的SWT问题

前端之家收集整理的这篇文章主要介绍了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)

我读过这个

syncExec(Runnable runnable) causes the current thread (if it is different than the user interface thread of the display) to wait for the runnable to finish.

但是Runnable是时间常数……

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

谢谢

解决方法

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

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

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

猜你在找的Java相关文章