switched to Scheduled Executor because old timer is not working on Windows

This commit is contained in:
hneemann 2016-04-01 13:15:48 +02:00
parent 2a1f478ff0
commit c8fb6026b4
3 changed files with 73 additions and 69 deletions

View File

@ -107,9 +107,7 @@
<elementAttributes> <elementAttributes>
<entry> <entry>
<string>rotation</string> <string>rotation</string>
<de.neemann.digital.core.element.Rotation> <rotation rotation="1"/>
<rotation>1</rotation>
</de.neemann.digital.core.element.Rotation>
</entry> </entry>
<entry> <entry>
<string>Bits</string> <string>Bits</string>
@ -228,9 +226,7 @@
<elementAttributes> <elementAttributes>
<entry> <entry>
<string>rotation</string> <string>rotation</string>
<de.neemann.digital.core.element.Rotation> <rotation rotation="1"/>
<rotation>1</rotation>
</de.neemann.digital.core.element.Rotation>
</entry> </entry>
<entry> <entry>
<string>Label</string> <string>Label</string>
@ -238,7 +234,7 @@
</entry> </entry>
<entry> <entry>
<string>Frequency</string> <string>Frequency</string>
<int>100</int> <int>1000</int>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="560" y="230"/> <pos x="560" y="230"/>
@ -277,166 +273,166 @@
<visualElement> <visualElement>
<elementName>GPO.dig</elementName> <elementName>GPO.dig</elementName>
<elementAttributes/> <elementAttributes/>
<pos x="700" y="130"/> <pos x="690" y="130"/>
<rotate>0</rotate> <rotate>0</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>LED</elementName> <elementName>LED</elementName>
<elementAttributes/> <elementAttributes/>
<pos x="760" y="50"/> <pos x="750" y="50"/>
<rotate>0</rotate> <rotate>0</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>LED</elementName> <elementName>LED</elementName>
<elementAttributes/> <elementAttributes/>
<pos x="760" y="70"/> <pos x="750" y="70"/>
<rotate>0</rotate> <rotate>0</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>LED</elementName> <elementName>LED</elementName>
<elementAttributes/> <elementAttributes/>
<pos x="760" y="90"/> <pos x="750" y="90"/>
<rotate>0</rotate> <rotate>0</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>LED</elementName> <elementName>LED</elementName>
<elementAttributes/> <elementAttributes/>
<pos x="760" y="110"/> <pos x="750" y="110"/>
<rotate>0</rotate> <rotate>0</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>LED</elementName> <elementName>LED</elementName>
<elementAttributes/> <elementAttributes/>
<pos x="760" y="130"/> <pos x="750" y="130"/>
<rotate>0</rotate> <rotate>0</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>LED</elementName> <elementName>LED</elementName>
<elementAttributes/> <elementAttributes/>
<pos x="760" y="150"/> <pos x="750" y="150"/>
<rotate>0</rotate> <rotate>0</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>LED</elementName> <elementName>LED</elementName>
<elementAttributes/> <elementAttributes/>
<pos x="760" y="170"/> <pos x="750" y="170"/>
<rotate>0</rotate> <rotate>0</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>LED</elementName> <elementName>LED</elementName>
<elementAttributes/> <elementAttributes/>
<pos x="760" y="190"/> <pos x="750" y="190"/>
<rotate>0</rotate> <rotate>0</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>LED</elementName> <elementName>LED</elementName>
<elementAttributes/> <elementAttributes/>
<pos x="760" y="210"/> <pos x="750" y="210"/>
<rotate>0</rotate> <rotate>0</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>LED</elementName> <elementName>LED</elementName>
<elementAttributes/> <elementAttributes/>
<pos x="760" y="230"/> <pos x="750" y="230"/>
<rotate>0</rotate> <rotate>0</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>LED</elementName> <elementName>LED</elementName>
<elementAttributes/> <elementAttributes/>
<pos x="760" y="250"/> <pos x="750" y="250"/>
<rotate>0</rotate> <rotate>0</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>LED</elementName> <elementName>LED</elementName>
<elementAttributes/> <elementAttributes/>
<pos x="760" y="270"/> <pos x="750" y="270"/>
<rotate>0</rotate> <rotate>0</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>LED</elementName> <elementName>LED</elementName>
<elementAttributes/> <elementAttributes/>
<pos x="760" y="290"/> <pos x="750" y="290"/>
<rotate>0</rotate> <rotate>0</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>LED</elementName> <elementName>LED</elementName>
<elementAttributes/> <elementAttributes/>
<pos x="760" y="310"/> <pos x="750" y="310"/>
<rotate>0</rotate> <rotate>0</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>LED</elementName> <elementName>LED</elementName>
<elementAttributes/> <elementAttributes/>
<pos x="760" y="330"/> <pos x="750" y="330"/>
<rotate>0</rotate> <rotate>0</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>LED</elementName> <elementName>LED</elementName>
<elementAttributes/> <elementAttributes/>
<pos x="760" y="350"/> <pos x="750" y="350"/>
<rotate>0</rotate> <rotate>0</rotate>
</visualElement> </visualElement>
</visualElements> </visualElements>
<wires> <wires>
<wire> <wire>
<p1 x="760" y="50"/> <p1 x="750" y="50"/>
<p2 x="730" y="130"/> <p2 x="720" y="130"/>
</wire> </wire>
<wire> <wire>
<p1 x="730" y="140"/> <p1 x="720" y="140"/>
<p2 x="760" y="70"/> <p2 x="750" y="70"/>
</wire> </wire>
<wire> <wire>
<p1 x="730" y="150"/> <p1 x="720" y="150"/>
<p2 x="760" y="90"/> <p2 x="750" y="90"/>
</wire> </wire>
<wire> <wire>
<p1 x="760" y="110"/> <p1 x="750" y="110"/>
<p2 x="730" y="160"/> <p2 x="720" y="160"/>
</wire> </wire>
<wire> <wire>
<p1 x="730" y="170"/> <p1 x="720" y="170"/>
<p2 x="760" y="130"/> <p2 x="750" y="130"/>
</wire> </wire>
<wire> <wire>
<p1 x="730" y="180"/> <p1 x="720" y="180"/>
<p2 x="760" y="150"/> <p2 x="750" y="150"/>
</wire> </wire>
<wire> <wire>
<p1 x="730" y="190"/> <p1 x="720" y="190"/>
<p2 x="760" y="170"/> <p2 x="750" y="170"/>
</wire> </wire>
<wire> <wire>
<p1 x="730" y="200"/> <p1 x="720" y="200"/>
<p2 x="760" y="190"/> <p2 x="750" y="190"/>
</wire> </wire>
<wire> <wire>
<p1 x="760" y="210"/> <p1 x="750" y="210"/>
<p2 x="730" y="210"/> <p2 x="720" y="210"/>
</wire> </wire>
<wire> <wire>
<p1 x="730" y="220"/> <p1 x="720" y="220"/>
<p2 x="760" y="230"/> <p2 x="750" y="230"/>
</wire> </wire>
<wire> <wire>
<p1 x="730" y="230"/> <p1 x="720" y="230"/>
<p2 x="760" y="250"/> <p2 x="750" y="250"/>
</wire> </wire>
<wire> <wire>
<p1 x="730" y="240"/> <p1 x="720" y="240"/>
<p2 x="760" y="270"/> <p2 x="750" y="270"/>
</wire> </wire>
<wire> <wire>
<p1 x="730" y="260"/> <p1 x="720" y="260"/>
<p2 x="760" y="310"/> <p2 x="750" y="310"/>
</wire> </wire>
<wire> <wire>
<p1 x="730" y="270"/> <p1 x="720" y="270"/>
<p2 x="760" y="330"/> <p2 x="750" y="330"/>
</wire> </wire>
<wire> <wire>
<p1 x="730" y="280"/> <p1 x="720" y="280"/>
<p2 x="760" y="350"/> <p2 x="750" y="350"/>
</wire> </wire>
<wire> <wire>
<p1 x="310" y="320"/> <p1 x="310" y="320"/>
@ -459,8 +455,8 @@
<p2 x="320" y="260"/> <p2 x="320" y="260"/>
</wire> </wire>
<wire> <wire>
<p1 x="730" y="250"/> <p1 x="720" y="250"/>
<p2 x="760" y="290"/> <p2 x="750" y="290"/>
</wire> </wire>
<wire> <wire>
<p1 x="450" y="70"/> <p1 x="450" y="70"/>
@ -532,7 +528,7 @@
</wire> </wire>
<wire> <wire>
<p1 x="610" y="140"/> <p1 x="610" y="140"/>
<p2 x="700" y="140"/> <p2 x="690" y="140"/>
</wire> </wire>
<wire> <wire>
<p1 x="310" y="270"/> <p1 x="310" y="270"/>
@ -592,7 +588,7 @@
</wire> </wire>
<wire> <wire>
<p1 x="650" y="130"/> <p1 x="650" y="130"/>
<p2 x="700" y="130"/> <p2 x="690" y="130"/>
</wire> </wire>
<wire> <wire>
<p1 x="280" y="150"/> <p1 x="280" y="150"/>
@ -664,7 +660,7 @@
</wire> </wire>
<wire> <wire>
<p1 x="650" y="160"/> <p1 x="650" y="160"/>
<p2 x="700" y="160"/> <p2 x="690" y="160"/>
</wire> </wire>
<wire> <wire>
<p1 x="310" y="290"/> <p1 x="310" y="290"/>
@ -716,7 +712,7 @@
</wire> </wire>
<wire> <wire>
<p1 x="630" y="150"/> <p1 x="630" y="150"/>
<p2 x="700" y="150"/> <p2 x="690" y="150"/>
</wire> </wire>
<wire> <wire>
<p1 x="310" y="300"/> <p1 x="310" y="300"/>

View File

@ -6,19 +6,23 @@ import de.neemann.digital.gui.GuiModelObserver;
import de.neemann.gui.ErrorMessage; import de.neemann.gui.ErrorMessage;
import javax.swing.*; import javax.swing.*;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/** /**
* @author hneemann * @author hneemann
*/ */
public class RealTimeClock implements ModelStateObserver { public class RealTimeClock implements ModelStateObserver {
private final Model model; private final Model model;
private final ScheduledThreadPoolExecutor executor;
private final int frequency; private final int frequency;
private final ObservableValue output; private final ObservableValue output;
private Timer timer; private ScheduledFuture<?> timer;
public RealTimeClock(Model model, Clock clock) { public RealTimeClock(Model model, Clock clock, ScheduledThreadPoolExecutor executor) {
this.model = model; this.model = model;
this.executor = executor;
int f = clock.getFrequency(); int f = clock.getFrequency();
if (f < 1) f = 1; if (f < 1) f = 1;
this.frequency = f; this.frequency = f;
@ -34,20 +38,21 @@ public class RealTimeClock implements ModelStateObserver {
int delay = 1000 / frequency; int delay = 1000 / frequency;
if (delay < 1) delay = 1; if (delay < 1) delay = 1;
timer = new Timer(delay, e -> {
timer = executor.scheduleAtFixedRate(() -> SwingUtilities.invokeLater(() -> {
output.setValue(1 - output.getValue()); output.setValue(1 - output.getValue());
try { try {
model.doStep(); model.doStep();
} catch (NodeException e1) { } catch (NodeException e1) {
SwingUtilities.invokeLater(new ErrorMessage("ClockError").addCause(e1)); SwingUtilities.invokeLater(new ErrorMessage("ClockError").addCause(e1));
timer.stop(); timer.cancel(false);
} }
}); }), delay, delay, TimeUnit.MILLISECONDS);
timer.start();
break; break;
case STOPPED: case STOPPED:
if (timer != null) if (timer != null)
timer.stop(); timer.cancel(false);
break; break;
} }
} }

View File

@ -24,6 +24,7 @@ import java.awt.event.WindowEvent;
import java.io.Closeable; import java.io.Closeable;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.prefs.Preferences; import java.util.prefs.Preferences;
/** /**
@ -58,6 +59,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave {
private Model model; private Model model;
private ModelDescription modelDescription; private ModelDescription modelDescription;
private boolean modelHasRunningClocks; private boolean modelHasRunningClocks;
private ScheduledThreadPoolExecutor timerExecuter = new ScheduledThreadPoolExecutor(1);
private Main() { private Main() {
this(null, null, null); this(null, null, null);
@ -95,6 +97,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave {
@Override @Override
public void windowClosed(WindowEvent e) { public void windowClosed(WindowEvent e) {
clearModelDescription(); // stop model timer if running clearModelDescription(); // stop model timer if running
timerExecuter.shutdown();
} }
}); });
@ -372,7 +375,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave {
if (runClock) if (runClock)
for (Clock c : model.getClocks()) for (Clock c : model.getClocks())
model.addObserver(new RealTimeClock(model, c)); model.addObserver(new RealTimeClock(model, c, timerExecuter));
model.init(); model.init();