X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.simulator.toolkit%2Fsrc%2Forg%2Fsimantics%2Fsimulator%2Ftoolkit%2FDynamicExperimentThreadSequenceRunner.java;fp=bundles%2Forg.simantics.simulator.toolkit%2Fsrc%2Forg%2Fsimantics%2Fsimulator%2Ftoolkit%2FDynamicExperimentThreadSequenceRunner.java;h=2143e5a338cf07f626eedf8b8d0bedd41aa5220d;hb=14a4f7a9d486fba5be815e511fb2a497fca4eb70;hp=0000000000000000000000000000000000000000;hpb=751ee12501d220832b672dd433655a4d65806fd9;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/DynamicExperimentThreadSequenceRunner.java b/bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/DynamicExperimentThreadSequenceRunner.java new file mode 100644 index 000000000..2143e5a33 --- /dev/null +++ b/bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/DynamicExperimentThreadSequenceRunner.java @@ -0,0 +1,72 @@ +package org.simantics.simulator.toolkit; + +import org.eclipse.core.runtime.NullProgressMonitor; +import org.simantics.scl.runtime.SCLContext; +import org.simantics.scl.runtime.function.Function; +import org.simantics.simulator.IDynamicExperimentLocal; + +/** + * @author Antti Villberg + * @since 1.34.0 + */ +public class DynamicExperimentThreadSequenceRunner { + @SuppressWarnings({ "rawtypes", "unchecked" }) + public static DynamicExperimentActionContext runAction(IDynamicExperimentLocal experiment, DynamicExperimentThread thread, Function action, final boolean simulateAndWaitCompletion) { + final DynamicExperimentActionContext context = new DynamicExperimentActionContext(experiment); + context.scheduleNextStep(action); + final Object sync = new Object(); + final SCLContext sclContext = SCLContext.getCurrent(); + + thread.addListener(new DynamicExperimentThreadListener() { + + @Override + public void beforeStep() { + if(!context.isStopped()) { + SCLContext.push(sclContext); + context.handleStep(experiment.getSimulationTime()); + SCLContext.pop(); + } + removeIfStopped(); + } + + public void removeIfStopped() { + if(context.isStopped()) { + thread.removeListener(this); + if(simulateAndWaitCompletion) { + experiment.simulate(false); + synchronized(sync) { + sync.notify(); + } + } + experiment.shutdown(new NullProgressMonitor()); + } + } + + }); + + if(simulateAndWaitCompletion) { + experiment.simulate(true); + + try { + synchronized(sync) { + while(!context.isStopped()) + sync.wait(1000L); + } + } catch(InterruptedException e) { + context.stop(); + } + + if (context.exceptions != null && !context.exceptions.isEmpty()) { + StringBuilder builder = new StringBuilder(); + builder.append("Action failures:"); + for (Exception e : context.exceptions) { + builder.append("\n"); + builder.append(e.getMessage()); + } + + throw new RuntimeException(builder.toString()); + } + } + return context; + } +}