avoids swing event queue flodding

This commit is contained in:
hneemann 2021-08-01 10:39:20 +02:00
parent 14f71687a9
commit 3e06dd5d71
5 changed files with 37 additions and 13 deletions

View File

@ -374,7 +374,7 @@ public class Model implements Iterable<Node>, SyncAccess {
brVal = new ArrayList<>(); brVal = new ArrayList<>();
for (Break b : breaks) for (Break b : breaks)
brVal.add(new BreakDetector(b)); brVal.add(new BreakDetector(b));
fireEvent(ModelEvent.FASTRUN); fireEvent(ModelEvent.RUN_TO_BREAK);
} }
ObservableValue clkVal = clocks.get(0).getClockOutput(); ObservableValue clkVal = clocks.get(0).getClockOutput();
@ -392,8 +392,10 @@ public class Model implements Iterable<Node>, SyncAccess {
if (timeout > 0) { if (timeout > 0) {
timeout--; timeout--;
if (timeout == 0) if (timeout == 0) {
fireEvent(ModelEvent.RUN_TO_BREAK_TIMEOUT);
return new BreakInfo(timeout); return new BreakInfo(timeout);
}
} }
} }
} catch (Exception e) { } catch (Exception e) {
@ -418,7 +420,7 @@ public class Model implements Iterable<Node>, SyncAccess {
if (clocks.size() == 1) if (clocks.size() == 1)
clkVal = clocks.get(0).getClockOutput(); clkVal = clocks.get(0).getClockOutput();
fireEvent(ModelEvent.FASTRUN); fireEvent(ModelEvent.RUN_TO_BREAK);
final boolean[] wasBreak = {false}; final boolean[] wasBreak = {false};
while (!wasBreak[0] && state != State.CLOSED) { while (!wasBreak[0] && state != State.CLOSED) {
if (!needsUpdate()) { if (!needsUpdate()) {

View File

@ -36,9 +36,13 @@ public class ModelEvent {
*/ */
public static final ModelEvent MICROSTEP = new ModelEvent(ModelEventType.MICROSTEP); 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 * Shorthand for a ModelEventType.BREAK event
*/ */

View File

@ -35,7 +35,12 @@ public enum ModelEventType {
/** /**
* Fast run is started. * Fast run is started.
*/ */
FASTRUN, RUN_TO_BREAK,
/**
* Fast run timeout has occurred.
*/
RUN_TO_BREAK_TIMEOUT,
/** /**
* A break is detected. * A break is detected.
@ -58,5 +63,4 @@ public enum ModelEventType {
* Used to notify an error * Used to notify an error
*/ */
ERROR_OCCURRED ERROR_OCCURRED
} }

View File

@ -1202,7 +1202,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
tc.getTestCaseDescription().setNewSeed(); tc.getTestCaseDescription().setNewSeed();
windowPosManager.register("testResult", new ValueTableDialog(Main.this, Lang.get("msg_testResult")) windowPosManager.register("testResult", new ValueTableDialog(Main.this, Lang.get("msg_testResult"))
.addTestResult(tsl, circuitComponent.getCircuit(), library)) .addTestResult(tsl, circuitComponent.getCircuit(), library))
.setVisible(true); .setVisible(true);
ensureModelIsStopped(); ensureModelIsStopped();
@ -1733,15 +1733,26 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
* Updates the graphic at every modification. * Updates the graphic at every modification.
*/ */
private class UpdateViewAtEvent implements ModelStateObserverTyped { private class UpdateViewAtEvent implements ModelStateObserverTyped {
private boolean stepUpdateEnabled;
UpdateViewAtEvent() { UpdateViewAtEvent() {
stepUpdateEnabled = true;
} }
@Override @Override
public void handleEvent(ModelEvent event) { public void handleEvent(ModelEvent event) {
switch (event.getType()) { switch (event.getType()) {
case RUN_TO_BREAK:
stepUpdateEnabled = false;
break;
case CHECKBURN: case CHECKBURN:
case STEP:
case BREAK: case BREAK:
stepUpdateEnabled = true;
case STEP:
if (stepUpdateEnabled)
circuitComponent.graphicHasChanged();
break;
case RUN_TO_BREAK_TIMEOUT:
circuitComponent.graphicHasChanged(); circuitComponent.graphicHasChanged();
break; break;
} }
@ -2238,8 +2249,11 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS
long time = System.currentTimeMillis(); long time = System.currentTimeMillis();
Model.BreakInfo info = model.runToBreak(steps); Model.BreakInfo info = model.runToBreak(steps);
time = System.currentTimeMillis() - time; time = System.currentTimeMillis() - time;
int newSteps = (int) (steps * 250 / time); System.out.println(time + ", " + steps);
steps = (steps + newSteps) / 2; if (time > 0) {
int newSteps = (int) (steps * 250 / time);
steps = (steps + newSteps) / 2;
}
if (info != null) { if (info != null) {
if (info.isTimeout() && model.isRunning()) if (info.isTimeout() && model.isRunning())

View File

@ -120,7 +120,7 @@ public class ProbeDialog extends JDialog implements ModelStateObserverTyped {
} }
} }
switch (event.getType()) { switch (event.getType()) {
case FASTRUN: case RUN_TO_BREAK:
tableUpdateEnable = false; tableUpdateEnable = false;
break; break;
case BREAK: case BREAK:
@ -133,7 +133,7 @@ public class ProbeDialog extends JDialog implements ModelStateObserverTyped {
@Override @Override
public ModelEventType[] getEvents() { 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 { private static class SignalTableModel implements TableModel {