From 3e06dd5d7113d667b17143101fccbb78598c56ec Mon Sep 17 00:00:00 2001 From: hneemann Date: Sun, 1 Aug 2021 10:39:20 +0200 Subject: [PATCH] avoids swing event queue flodding --- .../java/de/neemann/digital/core/Model.java | 8 ++++--- .../de/neemann/digital/core/ModelEvent.java | 8 +++++-- .../neemann/digital/core/ModelEventType.java | 8 +++++-- .../java/de/neemann/digital/gui/Main.java | 22 +++++++++++++++---- .../digital/gui/components/ProbeDialog.java | 4 ++-- 5 files changed, 37 insertions(+), 13 deletions(-) diff --git a/src/main/java/de/neemann/digital/core/Model.java b/src/main/java/de/neemann/digital/core/Model.java index a0d619644..95f0f6d9d 100644 --- a/src/main/java/de/neemann/digital/core/Model.java +++ b/src/main/java/de/neemann/digital/core/Model.java @@ -374,7 +374,7 @@ public class Model implements Iterable, SyncAccess { brVal = new ArrayList<>(); for (Break b : breaks) brVal.add(new BreakDetector(b)); - fireEvent(ModelEvent.FASTRUN); + fireEvent(ModelEvent.RUN_TO_BREAK); } ObservableValue clkVal = clocks.get(0).getClockOutput(); @@ -392,8 +392,10 @@ public class Model implements Iterable, SyncAccess { if (timeout > 0) { timeout--; - if (timeout == 0) + if (timeout == 0) { + fireEvent(ModelEvent.RUN_TO_BREAK_TIMEOUT); return new BreakInfo(timeout); + } } } } catch (Exception e) { @@ -418,7 +420,7 @@ public class Model implements Iterable, SyncAccess { if (clocks.size() == 1) clkVal = clocks.get(0).getClockOutput(); - fireEvent(ModelEvent.FASTRUN); + fireEvent(ModelEvent.RUN_TO_BREAK); final boolean[] wasBreak = {false}; while (!wasBreak[0] && state != State.CLOSED) { if (!needsUpdate()) { diff --git a/src/main/java/de/neemann/digital/core/ModelEvent.java b/src/main/java/de/neemann/digital/core/ModelEvent.java index 52026242d..033661663 100644 --- a/src/main/java/de/neemann/digital/core/ModelEvent.java +++ b/src/main/java/de/neemann/digital/core/ModelEvent.java @@ -36,9 +36,13 @@ public class ModelEvent { */ public static final ModelEvent MICROSTEP = new ModelEvent(ModelEventType.MICROSTEP); /** - * Shorthand for a ModelEventType.FASTRUN event + * Shorthand for a ModelEventType.RUN_TO_BREAK event */ - public static final ModelEvent FASTRUN = new ModelEvent(ModelEventType.FASTRUN); + public static final ModelEvent RUN_TO_BREAK = new ModelEvent(ModelEventType.RUN_TO_BREAK); + /** + * Shorthand for a ModelEventType.RUN_TO_BREAK_TIMEOUT event + */ + public static final ModelEvent RUN_TO_BREAK_TIMEOUT = new ModelEvent(ModelEventType.RUN_TO_BREAK_TIMEOUT); /** * Shorthand for a ModelEventType.BREAK event */ diff --git a/src/main/java/de/neemann/digital/core/ModelEventType.java b/src/main/java/de/neemann/digital/core/ModelEventType.java index 6f26a4649..6a281d50b 100644 --- a/src/main/java/de/neemann/digital/core/ModelEventType.java +++ b/src/main/java/de/neemann/digital/core/ModelEventType.java @@ -35,7 +35,12 @@ public enum ModelEventType { /** * Fast run is started. */ - FASTRUN, + RUN_TO_BREAK, + + /** + * Fast run timeout has occurred. + */ + RUN_TO_BREAK_TIMEOUT, /** * A break is detected. @@ -58,5 +63,4 @@ public enum ModelEventType { * Used to notify an error */ ERROR_OCCURRED - } diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java index 87535e599..0f93dea9e 100644 --- a/src/main/java/de/neemann/digital/gui/Main.java +++ b/src/main/java/de/neemann/digital/gui/Main.java @@ -1202,7 +1202,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS tc.getTestCaseDescription().setNewSeed(); windowPosManager.register("testResult", new ValueTableDialog(Main.this, Lang.get("msg_testResult")) - .addTestResult(tsl, circuitComponent.getCircuit(), library)) + .addTestResult(tsl, circuitComponent.getCircuit(), library)) .setVisible(true); ensureModelIsStopped(); @@ -1733,15 +1733,26 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS * Updates the graphic at every modification. */ private class UpdateViewAtEvent implements ModelStateObserverTyped { + private boolean stepUpdateEnabled; + UpdateViewAtEvent() { + stepUpdateEnabled = true; } @Override public void handleEvent(ModelEvent event) { switch (event.getType()) { + case RUN_TO_BREAK: + stepUpdateEnabled = false; + break; case CHECKBURN: - case STEP: case BREAK: + stepUpdateEnabled = true; + case STEP: + if (stepUpdateEnabled) + circuitComponent.graphicHasChanged(); + break; + case RUN_TO_BREAK_TIMEOUT: circuitComponent.graphicHasChanged(); break; } @@ -2238,8 +2249,11 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS long time = System.currentTimeMillis(); Model.BreakInfo info = model.runToBreak(steps); time = System.currentTimeMillis() - time; - int newSteps = (int) (steps * 250 / time); - steps = (steps + newSteps) / 2; + System.out.println(time + ", " + steps); + if (time > 0) { + int newSteps = (int) (steps * 250 / time); + steps = (steps + newSteps) / 2; + } if (info != null) { if (info.isTimeout() && model.isRunning()) diff --git a/src/main/java/de/neemann/digital/gui/components/ProbeDialog.java b/src/main/java/de/neemann/digital/gui/components/ProbeDialog.java index 30575d26b..02228c3fd 100644 --- a/src/main/java/de/neemann/digital/gui/components/ProbeDialog.java +++ b/src/main/java/de/neemann/digital/gui/components/ProbeDialog.java @@ -120,7 +120,7 @@ public class ProbeDialog extends JDialog implements ModelStateObserverTyped { } } switch (event.getType()) { - case FASTRUN: + case RUN_TO_BREAK: tableUpdateEnable = false; break; case BREAK: @@ -133,7 +133,7 @@ public class ProbeDialog extends JDialog implements ModelStateObserverTyped { @Override public ModelEventType[] getEvents() { - return new ModelEventType[]{type, ModelEventType.CHECKBURN, ModelEventType.FASTRUN, ModelEventType.BREAK, ModelEventType.CLOSED}; + return new ModelEventType[]{type, ModelEventType.CHECKBURN, ModelEventType.RUN_TO_BREAK, ModelEventType.BREAK, ModelEventType.CLOSED}; } private static class SignalTableModel implements TableModel {