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对象可能不会立即调用它。

链接地址: http://www.djcxy.com/p/45153.html

上一篇: SWT issue with syncExec()

下一篇: Detect trigger for animation