From 950098110f81399c4677bf7b877b1cd7e9418e15 Mon Sep 17 00:00:00 2001 From: "J. Neugebauer" Date: Wed, 6 Jul 2022 20:41:34 +0200 Subject: [PATCH] =?UTF-8?q?Eine=20TaskQueue=20in=20der=20Tasks=20geplant?= =?UTF-8?q?=20werden=20k=C3=B6nnen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Es können Tasks (Runnables) für die geplante Ausführung (z.B. in 100 ms) übergeben werden. Die Tasks werden dann jeweils am Ende eines Frames abgearbeitet. Bei Bedarf auch parallel mit dem TaskRunner. Das System sollte noch einmal Refactored werden. (Und ggf. auch auf seine Sinnhaftigkeit geprüft werden.) --- src/schule/ngb/zm/Zeichenmaschine.java | 40 ++++++++++++++++++++------ 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/src/schule/ngb/zm/Zeichenmaschine.java b/src/schule/ngb/zm/Zeichenmaschine.java index dcdace6..bcf387f 100644 --- a/src/schule/ngb/zm/Zeichenmaschine.java +++ b/src/schule/ngb/zm/Zeichenmaschine.java @@ -143,6 +143,9 @@ public class Zeichenmaschine extends Constants { // Hauptthread der Zeichenmaschine. private Thread mainThread; + // Queue für geplante Aufgaben + private DelayQueue taskQueue = new DelayQueue<>(); + // Queue für abgefangene InputEvents private BlockingQueue eventQueue = new LinkedBlockingQueue<>(); @@ -519,6 +522,23 @@ public class Zeichenmaschine extends Constants { running = false; } + /** + * Führt interne Aufräumarbeiten durch. + *

+ * Wird nach dem {@link #stop() Stopp} der Zeichenmaschine aufgerufen und + * verbleibende Threads, Tasks, etc. zu stoppen und aufzuräumen. Die + * Äquivalente Methode für Unterklassen ist {@link #teardown()}, die direkt + * vor {@code cleanup()} aufgerufen wird. + */ + private void cleanup() { + // Alle noch nicht ausgelösten Events werden entfernt + eventQueue.clear(); + // Alle noch nicht ausgeführten Tasks werden entfernt + taskQueue.clear(); + // TaskRunner stoppen + TaskRunner.shutdown(); + } + /** * Beendet die Zeichenmaschine vollständig. *

@@ -568,8 +588,8 @@ public class Zeichenmaschine extends Constants { * sichergestellt hat, dass eine Änderung der Größe der Zeichenfläche * zulässig und sinnvoll ist. * - * @param width Neue Breite der Zeichenleinwand. - * @param height Neue Höhe der Zeichenleinwand. + * @param newWidth Neue Breite der Zeichenleinwand. + * @param newHeight Neue Höhe der Zeichenleinwand. * @see #setSize(int, int) * @see #setFullscreen(boolean) */ @@ -1048,12 +1068,11 @@ public class Zeichenmaschine extends Constants { /* * Task scheduling */ - private DelayQueue taskQueue = new DelayQueue<>(); public void scheduleTask( Runnable runnable, int delay ) { taskQueue.add(new DelayedTask(delay, runnable)); } - + public void scheduleTask( Runnable runnable, int delay, boolean concurrent ) { DelayedTask task = new DelayedTask(delay, runnable); task.concurrent = concurrent; @@ -1065,8 +1084,8 @@ public class Zeichenmaschine extends Constants { DelayedTask task = taskQueue.poll(); while( task != null ) { if( task.concurrent ) { - SwingUtilities.invokeLater(task.runnable); - // new Thread(task.runnable).start(); + // SwingUtilities.invokeLater(task.runnable); + TaskRunner.run(task.runnable); } else { task.runnable.run(); } @@ -1364,7 +1383,9 @@ public class Zeichenmaschine extends Constants { } class DelayedTask implements Delayed { + long startTime; // in ms + Runnable runnable; boolean concurrent = false; @@ -1376,13 +1397,16 @@ public class Zeichenmaschine extends Constants { @Override public long getDelay( TimeUnit unit ) { - int diff = (int)(startTime - System.currentTimeMillis()); + int diff = (int) (startTime - System.currentTimeMillis()); return unit.convert(diff, TimeUnit.MILLISECONDS); } @Override public int compareTo( Delayed o ) { - return (int) (startTime- ((DelayedTask)o).startTime); + return (int) (startTime - ((DelayedTask) o).startTime); + } + + } class InputListener implements MouseInputListener, MouseMotionListener, MouseWheelListener, KeyListener{ @Override