Author: bpoussin Date: 2014-07-17 19:27:13 +0200 (Thu, 17 Jul 2014) New Revision: 4041 Url: http://forge.codelutin.com/projects/isis-fish/repository/revisions/4041 Log: add remaining time in progress bar Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationContext.java trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationControl.java trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/SimulationServiceTableModel.java trunk/src/main/resources/i18n/isis-fish_en_GB.properties trunk/src/main/resources/i18n/isis-fish_fr_FR.properties Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationContext.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationContext.java 2014-07-17 16:04:09 UTC (rev 4040) +++ trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationContext.java 2014-07-17 17:27:13 UTC (rev 4041) @@ -44,11 +44,12 @@ import fr.ifremer.isisfish.util.IsisCache; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -//import fr.ifremer.isisfish.util.Trace; import org.nuiton.config.ApplicationConfig; import org.nuiton.config.OverwriteApplicationConfig; import org.nuiton.math.matrix.MatrixFactory; +import org.nuiton.profiling.Statistic; import org.nuiton.profiling.Trace; +import org.nuiton.profiling.Unit; /** * Keep all information on one simulation. @@ -87,10 +88,40 @@ protected PropertyChangeListener stepListener = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { - SimulationContext.this.fireStepChange(new TimeStep((Integer)evt.getNewValue())); + Integer i = (Integer)evt.getNewValue(); + SimulationContext.this.fireStepChange(new TimeStep(i)); + + // met a jour les stats sur le temps des pas de temps + Statistic stat = SimulationContext.this.timeStepStat; + stat.add(i); + SimulationContext.this.getSimulationControl().setTimeStepMeanTime( + Unit.Time.nano.convertTo(Unit.Time.s, stat.getMean())); } }; + protected Statistic timeStepStat = new Statistic("Step time"){ + protected long lastTime = 0; + // add delta not value + @Override + public void add(long value) { + if (lastTime == 0) { + lastTime = System.nanoTime(); + } else { + long newTime = System.nanoTime(); + long delta = newTime - lastTime; + lastTime = newTime; + super.add(delta); + } + + } + + @Override + public String formatValue(long value) { + String result = String.valueOf(Unit.Time.nano.convertTo(Unit.Time.s, value)); + return result; + } + }; + protected ClassLoader classLoader = null; protected File scriptDirectory; /** l'objet trace qui conserve les donnees statistiques des appels de methodes */ @@ -311,6 +342,10 @@ this.simulation = simulation; } + public Statistic getTimeStepStat() { + return timeStepStat; + } + /** * @return Returns the simulationControl. */ Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationControl.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationControl.java 2014-07-17 16:04:09 UTC (rev 4040) +++ trunk/src/main/java/fr/ifremer/isisfish/simulator/SimulationControl.java 2014-07-17 17:27:13 UTC (rev 4041) @@ -65,6 +65,8 @@ protected long progressMax = 0; protected long progress = 0; protected String text = ""; + // temps moyen d'un pas de temps vaut 0 tant que pas mis a jour + protected double timeStepMeanTime; /** Control save mecanism each time a property is changed (default to false). */ protected transient boolean autoSaveState = false; @@ -303,6 +305,25 @@ } /** + * Set mean time for one step in second + * @param timeStepMeanTime + */ + public void setTimeStepMeanTime(double timeStepMeanTime) { + double oldValue = this.timeStepMeanTime; + this.timeStepMeanTime = timeStepMeanTime; + listeners.firePropertyChange("timeStepMeanTime", oldValue, this.timeStepMeanTime); + } + + /** + * Get mean time for one step in second + * @return + */ + public double getTimeStepMeanTime() { + return timeStepMeanTime; + } + + + /** * Met dans un Properties tous les champs * @return un Properties avec tous les champs */ @@ -318,6 +339,7 @@ result.setProperty("progressMax", String.valueOf(progressMax)); result.setProperty("progress", String.valueOf(progress)); result.setProperty("text", text); + result.setProperty("timeStepMeanTime", String.valueOf(timeStepMeanTime)); return result; } @@ -371,6 +393,10 @@ String text = props.getProperty("text"); setText(text); } + if (props.containsKey("timeStepMeanTime")) { + double timeStepMeanTime = Double.parseDouble(props.getProperty("timeStepMeanTime")); + setTimeStepMeanTime(timeStepMeanTime); + } } finally { inUpdateFromProperties = false; } Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java 2014-07-17 16:04:09 UTC (rev 4040) +++ trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java 2014-07-17 17:27:13 UTC (rev 4041) @@ -71,8 +71,6 @@ import fr.ifremer.isisfish.types.TimeStep; import fr.ifremer.isisfish.util.CompileHelper; import org.nuiton.math.matrix.MatrixFactory; -import org.nuiton.profiling.Statistic; -import org.nuiton.profiling.Unit; /** * Fait une simulation dans la meme jvm. @@ -89,46 +87,8 @@ private static Log log = LogFactory .getLog(InProcessSimulatorLauncher.class); - protected static class StepTimeStat implements SimulationListener { - - protected long lastTime = 0; - protected Statistic stat = new Statistic("Step time"){ - @Override - public String formatValue(long value) { - String result = String.valueOf(Unit.Time.nano.convertTo(Unit.Time.s, value)); - return result; - } - }; - - public Statistic getStat() { - return stat; - } - - @Override - public void beforeSimulation(SimulationContext context) { - } - - @Override - public void stepChange(SimulationContext context, TimeStep step) { - if (lastTime == 0) { - lastTime = System.nanoTime(); - } else { - long newTime = System.nanoTime(); - long delta = newTime - lastTime; - lastTime = newTime; - stat.add(delta); - } - } - - @Override - public void afterSimulation(SimulationContext context) { - } - - } - protected SimulationStorage simulation; - protected StepTimeStat stepTimeStat = new StepTimeStat(); - + /** * {@inheritDoc} */ @@ -475,7 +435,7 @@ simulatorObject.simulate(context); simulation.getInformation().addInformation( - stepTimeStat.getStat().exportText(null).toString()); + context.getTimeStepStat().exportText(null).toString()); // // Ajout des nouveaux objets créés durant la simulation @@ -588,9 +548,6 @@ // - ResultStorage context.addSimulationListener(simulation.getResultStorage()); - // ajout du listener de statistique sur le temps de chaque pas de temps - context.addSimulationListener(stepTimeStat); - // - TODO: mexico xml result // - TODO: vle result String simListener = context.getSimulationStorage().getParameter() Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/SimulationServiceTableModel.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/SimulationServiceTableModel.java 2014-07-17 16:04:09 UTC (rev 4040) +++ trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/SimulationServiceTableModel.java 2014-07-17 17:27:13 UTC (rev 4041) @@ -43,6 +43,8 @@ import fr.ifremer.isisfish.simulator.SimulationControl; import fr.ifremer.isisfish.simulator.SimulationParameter; import fr.ifremer.isisfish.types.TimeStep; +import org.apache.commons.lang3.time.DurationFormatUtils; +import org.nuiton.profiling.Unit; /** * Model de table pour suivre l'evolution des differentes simulations en cours. @@ -266,13 +268,25 @@ break; case 4: JProgressBar pb = getProgressBar(job); - pb.setMaximum((int) control.getProgressMax()); - pb.setValue((int) control.getProgress()); + int value = (int) control.getProgress(); + int max = (int) control.getProgressMax(); + + String restTime = ""; + int rest = max - value; + double time = rest * control.getTimeStepMeanTime(); + if (time > 0) { + long milli = (long)Unit.Time.s.convertTo(Unit.Time.milli, time); + restTime = DurationFormatUtils.formatDurationHMS(milli); + } + + pb.setMaximum(max); + pb.setValue(value); + // progress can be used for other things TimeStep step = control.getStep(); if (step != null) { - pb.setString(step.getMonth() + "/" + step.getYear()); + pb.setString(step.getMonth() + "/" + step.getYear() + " ("+ restTime +")"); } else { pb.setString(""); @@ -329,6 +343,7 @@ setData(); } + @Override public void setData() { ArrayList<SimulationJob> jobs = new ArrayList<SimulationJob>(simulationService.getJobs()); for (SimulationJob job : jobs) { @@ -338,6 +353,7 @@ model.setJobs(jobs); } + @Override public void simulationStart(SimulationService simService, SimulationJob job) { model.addJob(job); @@ -345,6 +361,7 @@ model.controlListener); } + @Override public void simulationStop(SimulationService simService, SimulationJob job) { model.removeJob(job); @@ -352,6 +369,7 @@ model.controlListener); } + @Override public void clearJobDone(SimulationService simService) { // nothing to do } Modified: trunk/src/main/resources/i18n/isis-fish_en_GB.properties =================================================================== --- trunk/src/main/resources/i18n/isis-fish_en_GB.properties 2014-07-17 16:04:09 UTC (rev 4040) +++ trunk/src/main/resources/i18n/isis-fish_en_GB.properties 2014-07-17 17:27:13 UTC (rev 4041) @@ -531,7 +531,7 @@ isisfish.input.tree.strategies=Strategies isisfish.input.tree.triptypes=Trip types isisfish.input.tree.vesseltypes=Vessel types -isisfish.input.tree.zones=Zones +isisfish.input.tree.zones= isisfish.launch.anonymous=read only isisfish.launch.email=email isisfish.launch.firstname=firstname @@ -722,14 +722,14 @@ isisfish.population.capturability=Capturability isisfish.population.comments=Comments isisfish.population.group=Group -isisfish.population.groups=Groups +isisfish.population.groups= isisfish.population.mappingZoneReproZoneRecru=MappingZoneReproZoneRecru isisfish.population.matrixAbundance=Abundance matrix isisfish.population.matrixAbundance1D=matrixAbundance1D isisfish.population.recruitment=Recruitment isisfish.population.reproduction=Reproduction isisfish.population.season=Season -isisfish.population.zones=Zones +isisfish.population.zones= isisfish.populationBasics.confirmCreateGroups=Warning, running groups creation wizard will delete all existing groups and objects which depend on it.\nDo you want to re-create groups ? isisfish.populationBasics.geographicID=Geographic identifier isisfish.populationBasics.groupMax=Max group @@ -762,7 +762,7 @@ isisfish.populationGroup.naturalDeathRate=Natural death rate isisfish.populationGroup.price=Price isisfish.populationGroup.reproductionRate=Reproduction rate -isisfish.populationGroup.title=Groups +isisfish.populationGroup.title= isisfish.populationGroup.toString=%1$s Group %2$s isisfish.populationMigration.comments=Comments isisfish.populationMigration.selectSeason=Select a season @@ -808,7 +808,7 @@ isisfish.populationZones.selectPopulationAreas=Select the population areas isisfish.populationZones.selectRecruitmentAreas=Select the recruitment areas isisfish.populationZones.selectSpawningAreas=Select the spawning areas -isisfish.populationZones.title=Zones +isisfish.populationZones.title= isisfish.port.cell=Port cell isisfish.port.comments=Comments isisfish.port.name=Name Modified: trunk/src/main/resources/i18n/isis-fish_fr_FR.properties =================================================================== --- trunk/src/main/resources/i18n/isis-fish_fr_FR.properties 2014-07-17 16:04:09 UTC (rev 4040) +++ trunk/src/main/resources/i18n/isis-fish_fr_FR.properties 2014-07-17 17:27:13 UTC (rev 4041) @@ -531,7 +531,7 @@ isisfish.input.tree.strategies=Stratégies isisfish.input.tree.triptypes=Types de marée isisfish.input.tree.vesseltypes=Types de navire -isisfish.input.tree.zones=Zones +isisfish.input.tree.zones= isisfish.launch.anonymous=lecture seule isisfish.launch.email=courriel isisfish.launch.firstname=nom @@ -724,7 +724,7 @@ isisfish.population.recruitment=Recrutement isisfish.population.reproduction=Reproduction isisfish.population.season=Saison -isisfish.population.zones=Zones +isisfish.population.zones= isisfish.populationBasics.confirmCreateGroups=Attention, la re-création des groupes supprimera les groupes existants et tous les objets qui en dépendent.\nÊtes vous sur de vouloir re-créer les groupes ? isisfish.populationBasics.geographicID=Identifiant géographique isisfish.populationBasics.groupMax=Group max @@ -803,7 +803,7 @@ isisfish.populationZones.selectPopulationAreas=Sélectionnez les zones des populations isisfish.populationZones.selectRecruitmentAreas=Sélectionnez les zones de recrutement isisfish.populationZones.selectSpawningAreas=Sélectionnez les zones de reproduction -isisfish.populationZones.title=Zones +isisfish.populationZones.title= isisfish.port.cell=Maille du port isisfish.port.comments=Commentaires isisfish.port.name=Nom