From a31ec502d45eb1a4eacdeb08e21a0afac120c5a4 Mon Sep 17 00:00:00 2001 From: "J. Neugebauer" Date: Fri, 1 Jul 2022 13:05:23 +0200 Subject: [PATCH] =?UTF-8?q?M=C3=B6glichkeit=20beliebige=20Tasks=20zu=20tim?= =?UTF-8?q?en?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die ZM kann nun beliebige Runnables mit einem Zeitdelay versehen ausführen. Mitteles `scheduleTask(Runnable, int)` wird das angegebene Runnable nach der angegebene Anzahl Millisekunden ausgeführt. Tasks werden immer am Ende eines Frames ausgeführt. --- src/schule/ngb/zm/Zeichenmaschine.java | 60 +++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/src/schule/ngb/zm/Zeichenmaschine.java b/src/schule/ngb/zm/Zeichenmaschine.java index 4d4a9e3..090fcfe 100644 --- a/src/schule/ngb/zm/Zeichenmaschine.java +++ b/src/schule/ngb/zm/Zeichenmaschine.java @@ -12,8 +12,7 @@ import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.LinkedList; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.*; /** * Hauptklasse der Zeichenmaschine. @@ -1090,6 +1089,37 @@ public class Zeichenmaschine extends Constants { // Intentionally left blank } + /* + * 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; + taskQueue.add(task); + } + + private void runTasks() { + synchronized( taskQueue ) { + DelayedTask task = taskQueue.poll(); + while( task != null ) { + if( task.concurrent ) { + SwingUtilities.invokeLater(task.runnable); + // new Thread(task.runnable).start(); + } else { + task.runnable.run(); + } + + task = taskQueue.poll(); + } + } + } + /* * Mouse handling */ @@ -1324,6 +1354,8 @@ public class Zeichenmaschine extends Constants { dispatchEvents(); } + runTasks(); + // delta time in ns long afterTime = System.nanoTime(); long dt = afterTime - beforeTime; @@ -1380,4 +1412,28 @@ public class Zeichenmaschine extends Constants { } + class DelayedTask implements Delayed { + long startTime; // in ms + Runnable runnable; + + boolean concurrent = false; + + public DelayedTask( int delay, Runnable runnable ) { + this.startTime = System.currentTimeMillis() + delay; + this.runnable = runnable; + } + + @Override + public long getDelay( TimeUnit unit ) { + int diff = (int)(startTime - System.currentTimeMillis()); + return unit.convert(diff, TimeUnit.MILLISECONDS); + } + + @Override + public int compareTo( Delayed o ) { + return (int) (startTime- ((DelayedTask)o).startTime); + } + + } + }