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