【问题标题】:Difference between syncExec() and asyncExec() of Display classDisplay类的syncExec()和asyncExec()的区别
【发布时间】:2012-06-19 11:40:18
【问题描述】:

我正在开发一个使用 Eclipse 后台处理的插件项目。
Display 类的 syncExec()asyncExec() 方法有什么区别?它们适用于哪些情况?任何示例都会有所帮助。

【问题讨论】:

    标签: eclipse-rcp


    【解决方案1】:

    来自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()。

    【讨论】:

      【解决方案2】:

      除了 Tom Seidel 的回答之外,以下是您可能想要使用其中一种情况的示例:

      • 当您想要更新 UI 中的某些内容而不关心结果时,请使用 asyncExec。例如更新标签或进度条。

      • 使用syncExec,该方法调用之后的代码需要确保 UI 处于一致状态,或者需要来自 UI 的一些数据。例如从用户对话框中获取一些数据。或者您更新一个小部件,然后在执行任何其他操作(例如另一个 UI 更新)之前,您想知道小部件更新已完成。

      【讨论】:

        【解决方案3】:

        SWT 实现单线程 UI 模型。在这个模型中,只有 UI 线程可以调用 UI 操作。如果您尝试从 UI 线程外部访问 SWT 对象,则会收到异常“org.eclipse.swt.SWTException: Invalid thread access”。所以为了允许其他线程对属于 UI 线程的对象执行操作,SWT 提供了 syncExec 和 asyncExec 方法。

        这个link 可以帮你举个例子

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-11-13
          • 2012-02-16
          • 2022-12-18
          • 2017-08-02
          • 1970-01-01
          • 2013-02-25
          • 2014-01-02
          相关资源
          最近更新 更多