java - 等待使用 Display::asyncExec() 提交到 SWT UI 线程的所有 Runnable 完成

标签 java swt eclipse-rcp

有没有办法等待所有通过 asyncExec(...) 提交到 SWT UI 线程的 Runnable 完成?

背景:

我有一个长时间运行的操作,其中包括触发事件,这些事件又通过 Display 的 asyncExec(...) 实例方法将 Runnable 提交给 SWT UI 线程。

长时间运行的操作的进度显示在 ProgressMonitorDialog 中,我想仅在 UI 线程执行完 Runnable 后关闭对话框。

将调用从 asyncExec(...) 更改为 syncExec(...) 不是一个选项,因为当从其他上下文触发事件时不需要后者。

最佳答案

org.eclipse.swt.widgets.Display.readAndDispatch() 将处理事件队列中的一个事件,如果没有更多事件要处理,则返回 false。但是您可能不想在它处理事件时使用它。

asyncExec(*) 是一个 FIFO 队列(尽管操作系统图形事件取代了 asyncExecs),因此您可以执行大部分长时间运行的操作处理,然后将最后一个 asyncExec 放入队列中:

final boolean[] done = new boolean[1];
Runnable r = new Runnable() {
  public void run() {
    done[0] = true;
  }
};
// now wait for the event somehow.  The brute force method:
while (!done[0]) {
  Thread.sleep(200);
}

理论上,从您的长时间运行的操作中产生的所有其他 asyncExec 将在您到达最后一个时完成。

编辑:潜在的其他选择

创建您自己的 org.eclipse.core.runtime.jobs.Job 然后在最后 join() 它:

public static class RefCountJob extends Job {
    public RefCountJob() {
        super("REF_COUNT");
    }

    int count = 0;

    public void increment() {
        count++;
    }

    public void decrement() {
        count--;
    }

    @Override
    protected IStatus run(IProgressMonitor monitor) {
        monitor.beginTask("WAITING", IProgressMonitor.UNKNOWN);
        while (count > 0) {
            Thread.sleep(200);
            monitor.worked(1);
        }
        monitor.done();
        return Status.OK_STATUS;
    }
}

要使用它,每次你要触发事件时递增()它,并让它们在它们完成时递减它(你必须确保它们递减它,无论抛出什么异常:-)

RefCountJob ref = new RefCountJob();
// ... do stuff, everybody increments and decrements ref
ref.increment();
// ... do more stuff
ref.increment();
// at the end of your long-running job
ref.schedule();
ref.join();

关于java - 等待使用 Display::asyncExec() 提交到 SWT UI 线程的所有 Runnable 完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8210331/

相关文章:

java - 如何在 Java 中对文本文件进行冒泡排序

java - 如何在不激活 shell 的情况下打开它?

java - JTable CellRenderer 仅在聚焦时更改前景色

java - 如何使用 Java ZoneId 的区域设置?

Java SWT 链接小部件 - 如何删除超链接下划线?

java - 以编程方式单击 swt 中的组合框按钮

java - 是否可以制作一个透明背景的窗口?

java - JFace LabelProvider : How can I know the header/name of a column within a LabelProvider?

java - Eclipse RCP 3.X 到 4——经典 CSS

java - ArrayIndexOutOfBounds 但数组大小设置正确