7

这是我在 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 分钟和其他一些时间。

谢谢

4

2 回答 2

3

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

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

不要试图在此处将 syncExec 与 aSyncExec 交换。如果您计算 aSyncExec 执行所需的时间,您会发现它甚至更快。但那是因为你所掌握的只是告诉 UI 线程你有事情要做需要多长时间(而不是需要多长时间)。

于 2010-03-04T15:30:33.180 回答
1

根据Display类文档syncExec

导致用户界面线程在下一个合理的机会调用runnable 的run() 方法。调用此方法的线程被挂起,直到可运行对象完成。将 null 指定为可运行对象只会唤醒用户界面线程。

因此,您的run方法在恒定时间内运行,但Display对象可能并不总是立即调用它。

于 2010-03-04T13:33:37.140 回答