Java syncExec()的SWT问题

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

这是我关于StackOverflow的第一个问题(对不起我的英语)。我会尽力解释这个问题

我有一个swt应用程序和一个前台jade应用程序,其中我有一个进度条来通知应用程序的持续时间。要刷新此进度条,我使用:

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线程中,并且任何其他对此线程的请求都必须等待轮到它们。