X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=core%2Fsrc%2Fnet%2Fsf%2Fopenrocket%2Fgui%2Fmain%2FSimulationRunDialog.java;fp=core%2Fsrc%2Fnet%2Fsf%2Fopenrocket%2Fgui%2Fmain%2FSimulationRunDialog.java;h=65fabb8fa36430ef8384c7a2dd5749ba0bc10e7c;hb=9349577cdfdff682b2aabd6daa24fdc3a7449b58;hp=f85b248f640367a37df394fe710cabeef884e2d9;hpb=30ba0a882f0c061176ba14dbf86d3d6fad096c02;p=debian%2Fopenrocket diff --git a/core/src/net/sf/openrocket/gui/main/SimulationRunDialog.java b/core/src/net/sf/openrocket/gui/main/SimulationRunDialog.java index f85b248f..65fabb8f 100644 --- a/core/src/net/sf/openrocket/gui/main/SimulationRunDialog.java +++ b/core/src/net/sf/openrocket/gui/main/SimulationRunDialog.java @@ -10,8 +10,11 @@ import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.Iterator; import java.util.List; -import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import javax.swing.JButton; import javax.swing.JDialog; @@ -21,6 +24,7 @@ import javax.swing.JPanel; import javax.swing.JProgressBar; import net.miginfocom.swing.MigLayout; +import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.document.Simulation; import net.sf.openrocket.gui.dialogs.DetailDialog; import net.sf.openrocket.gui.util.GUIUtil; @@ -32,6 +36,8 @@ import net.sf.openrocket.rocketcomponent.MotorMount; import net.sf.openrocket.rocketcomponent.MotorMount.IgnitionEvent; import net.sf.openrocket.simulation.FlightEvent; import net.sf.openrocket.simulation.SimulationStatus; +import net.sf.openrocket.simulation.customexpression.CustomExpression; +import net.sf.openrocket.simulation.customexpression.CustomExpressionSimulationListener; import net.sf.openrocket.simulation.exception.SimulationCancelledException; import net.sf.openrocket.simulation.exception.SimulationException; import net.sf.openrocket.simulation.exception.SimulationLaunchException; @@ -58,8 +64,28 @@ public class SimulationRunDialog extends JDialog { private static final double APOGEE_PROGRESS = 0.7; - private final static ExecutorService executor = Executors.newFixedThreadPool( - SwingPreferences.getMaxThreadCount()); + /** + * A single ThreadPoolExecutor that will be used for all simulations. + * This executor must not be shut down. + */ + private static final ThreadPoolExecutor executor; + static { + int n = SwingPreferences.getMaxThreadCount(); + executor = new ThreadPoolExecutor(n, n, + 0L, TimeUnit.MILLISECONDS, + new LinkedBlockingQueue(), + new ThreadFactory() { + private ThreadFactory factory = Executors.defaultThreadFactory(); + + @Override + public Thread newThread(Runnable r) { + Thread t = factory.newThread(r); + t.setDaemon(true); + return t; + } + }); + } + private final JLabel simLabel, timeLabel, altLabel, velLabel; @@ -72,6 +98,7 @@ public class SimulationRunDialog extends JDialog { * will result in an exception being thrown! */ private final Simulation[] simulations; + private final OpenRocketDocument document; private final String[] simulationNames; private final SimulationWorker[] simulationWorkers; private final SimulationStatus[] simulationStatuses; @@ -79,9 +106,10 @@ public class SimulationRunDialog extends JDialog { private final double[] simulationMaxVelocity; private final boolean[] simulationDone; - public SimulationRunDialog(Window window, Simulation... simulations) { + public SimulationRunDialog(Window window, OpenRocketDocument document, Simulation... simulations) { //// Running simulations... super(window, trans.get("SimuRunDlg.title.RunSim"), Dialog.ModalityType.APPLICATION_MODAL); + this.document = document; if (simulations.length == 0) { throw new IllegalArgumentException("Called with no simulations to run"); @@ -106,7 +134,7 @@ public class SimulationRunDialog extends JDialog { for (int i = 0; i < n; i++) { simulationNames[i] = simulations[i].getName(); - simulationWorkers[i] = new InteractiveSimulationWorker(simulations[i], i); + simulationWorkers[i] = new InteractiveSimulationWorker(document, simulations[i], i); executor.execute(simulationWorkers[i]); } @@ -172,10 +200,10 @@ public class SimulationRunDialog extends JDialog { * the Cancel button on the dialog. */ public void cancelSimulations() { - executor.shutdownNow(); for (SimulationWorker w : simulationWorkers) { w.cancel(true); } + executor.purge(); } @@ -185,8 +213,8 @@ public class SimulationRunDialog extends JDialog { * @param parent the parent Window of the dialog to use. * @param simulations the simulations to run. */ - public static void runSimulations(Window parent, Simulation... simulations) { - new SimulationRunDialog(parent, simulations).setVisible(true); + public static void runSimulations(Window parent, OpenRocketDocument document, Simulation... simulations) { + new SimulationRunDialog(parent, document, simulations).setVisible(true); } @@ -254,6 +282,8 @@ public class SimulationRunDialog extends JDialog { private volatile double burnoutVelocity; private volatile double apogeeAltitude; + private final CustomExpressionSimulationListener exprListener; + /* * -2 = time from 0 ... burnoutTimeEstimate * -1 = velocity from v(burnoutTimeEstimate) ... 0 @@ -264,8 +294,10 @@ public class SimulationRunDialog extends JDialog { private int progress = 0; - public InteractiveSimulationWorker(Simulation sim, int index) { + public InteractiveSimulationWorker(OpenRocketDocument doc, Simulation sim, int index) { super(sim); + List exprs = doc.getCustomExpressions(); + exprListener = new CustomExpressionSimulationListener(exprs); this.index = index; // Calculate estimate of motor burn time @@ -291,7 +323,7 @@ public class SimulationRunDialog extends JDialog { */ @Override protected SimulationListener[] getExtraListeners() { - return new SimulationListener[] { new SimulationProgressListener() }; + return new SimulationListener[] { new SimulationProgressListener(), exprListener }; }