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);
}
Теоретически, все другие asyncExecs, порожденные вашей длительной операцией, будут завершены к тому времени, когда вы доберетесь до последней.
РЕДАКТИРОВАТЬ : возможный другой вариант
Создайте свой собственный 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();