package org.drugis.common.threading; import org.drugis.common.threading.event.ListenerManager; class IterativeSuspendable extends AbstractSuspendable { private ListenerManager d_mgr; private final IterativeComputation d_computation; private int d_interval = 0; public IterativeSuspendable(final IterativeComputation computation) { d_computation = computation; } public void run() { d_computation.initialize(); waitIfSuspended(); while (d_computation.getIteration() < d_computation.getTotalIterations()) { if (d_interval > 0 && d_computation.getIteration() % d_interval == 0) { fireProgress(); } d_computation.step(); waitIfSuspended(); } if (d_interval > 0) { fireProgress(); } d_computation.finish(); } private void fireProgress() { d_mgr.fireTaskProgress(d_computation.getIteration(), d_computation.getTotalIterations()); } public void setListenerManager(final ListenerManager mgr) { d_mgr = mgr; } public void setReportingInterval(final int interval) { d_interval = interval; } }