我正在开发一个插件项目,我正在使用Eclipse后台处理 syncExec()类的asyncExec()和Display方法之间有什么区别?它们适用于哪些情况?任何例子都可能有所帮助。
答案 0 :(得分:16)
来自Q: Why do I get the error "org.eclipse.swt.SWTException: Invalid thread access"?
要允许后台线程对属于UI线程的对象执行操作,请使用Display的方法syncExec(Runnable runnable)和asyncExec(Runnable runnable)。这些是SWT中可以从任何线程调用的唯一方法。它们允许UI线程执行runnable,同步,导致后台线程等待runnable完成,或者异步允许后台线程继续执行而不等待结果。使用syncExec()执行的runnable最接近匹配对UI操作的等效直接调用,因为Java方法调用总是在继续之前等待结果,就像syncExec()一样。
答案 1 :(得分:7)
添加到Tom Seidel的答案中,以下是您可能想要使用其中一种情况的示例:
如果您想在UI中更新某些内容而不关心结果,请使用asyncExec
。例如,更新标签或进度条。
使用syncExec
,其中该方法调用之后的代码需要确保UI处于一致状态,或者需要来自UI的一些数据。例如,从用户对话框中获取一些数据。或者您更新窗口小部件,然后在执行任何其他操作(例如,另一个UI更新)之前,您希望知道窗口小部件更新已完成。
答案 2 :(得分:1)
SWT实现单线程UI模型。在此模型中,只有UI线程可以调用UI操作。如果您尝试从UI线程外部访问SWT对象,则会出现异常“org.eclipse.swt.SWTException:无效的线程访问”。因此,为了允许其他线程对属于UI线程的对象执行操作,SWT提供了syncExec和asyncExec方法。
此link可能会为您提供示例