Syncronisation des Zeichenthreads mit update/draw über eigenen Zustand

delay() setzt den Zustand auf DELAYED und der Zeichenthread läuft weiter, wenn der update/draw Thread in diesen Zustand wechselt (also delay() aufgerufen wurde). Es wird nicht mehr Thread.getState() geprüft, dies zu unzuverlässi gwar.
This commit is contained in:
ngb
2022-07-21 10:54:08 +02:00
parent 99848e47f8
commit 371a962432
2 changed files with 15 additions and 9 deletions

View File

@@ -41,7 +41,8 @@ public final class Options {
PAUSED, PAUSED,
STOPPED, STOPPED,
TERMINATED, TERMINATED,
IDLE IDLE,
DELAYED
} }
/** /**

View File

@@ -27,7 +27,7 @@ import java.util.logging.Level;
* Die Klasse übernimmt die Initialisierung eines Programmfensters und der * Die Klasse übernimmt die Initialisierung eines Programmfensters und der
* nötigen Komponenten. * nötigen Komponenten.
*/ */
// TODO: Refactorings (besonders in Bezug auf Nebenläufigkeit) @SuppressWarnings( "unused" )
public class Zeichenmaschine extends Constants { public class Zeichenmaschine extends Constants {
/** /**
@@ -966,6 +966,7 @@ public class Zeichenmaschine extends Constants {
} }
long timer = 0L; long timer = 0L;
/*
if( updateState == Options.AppState.DRAWING ) { if( updateState == Options.AppState.DRAWING ) {
// Falls gerade draw() ausgeführt wird, zeigen wir den aktuellen // Falls gerade draw() ausgeführt wird, zeigen wir den aktuellen
// Stand der Zeichnung auf der Leinwand an. Die Zeit für das // Stand der Zeichnung auf der Leinwand an. Die Zeit für das
@@ -974,7 +975,9 @@ public class Zeichenmaschine extends Constants {
canvas.render(); canvas.render();
timer = System.nanoTime() - timer; timer = System.nanoTime() - timer;
} }
*/
Options.AppState oldState = updateState;
try { try {
int sub = (int) Math.ceil(timer / 1000000.0); int sub = (int) Math.ceil(timer / 1000000.0);
@@ -982,9 +985,12 @@ public class Zeichenmaschine extends Constants {
return; return;
} }
updateState = Options.AppState.DELAYED;
Thread.sleep(ms - sub, (int) (timer % 1000000L)); Thread.sleep(ms - sub, (int) (timer % 1000000L));
} catch( InterruptedException ex ) { } catch( InterruptedException ex ) {
// Nothing // Nothing
} finally {
updateState = oldState;
} }
} }
@@ -1188,7 +1194,7 @@ public class Zeichenmaschine extends Constants {
private void enqueueEvent( InputEvent evt ) { private void enqueueEvent( InputEvent evt ) {
eventQueue.add(evt); eventQueue.add(evt);
if( isPaused() || isStopped()) { if( isPaused() || isStopped() ) {
dispatchEvents(); dispatchEvents();
} }
} }
@@ -1384,9 +1390,9 @@ public class Zeichenmaschine extends Constants {
* // Next frame has started * // Next frame has started
* </code></pre> * </code></pre>
* <p> * <p>
* Die {@link schule.ngb.zm.util.tasks.FrameSynchronizedTask} implementiert eine * Die {@link schule.ngb.zm.util.tasks.FrameSynchronizedTask} implementiert
* {@link schule.ngb.zm.util.tasks.Task}, die sich automatisch auf diese Wiese * eine {@link schule.ngb.zm.util.tasks.Task}, die sich automatisch auf
* mit dem Zeichenthread synchronisiert. * diese Wiese mit dem Zeichenthread synchronisiert.
*/ */
public static final Object globalSyncLock = new Object[0]; public static final Object globalSyncLock = new Object[0];
@@ -1696,9 +1702,8 @@ public class Zeichenmaschine extends Constants {
*/ */
public boolean isWaiting() { public boolean isWaiting() {
//return running && updateThread.getState() == Thread.State.TIMED_WAITING; //return running && updateThread.getState() == Thread.State.TIMED_WAITING;
return running && updateThread != null && updateThread.getState() == Thread.State.TIMED_WAITING; //return running && updateThread != null && updateThread.getState() == Thread.State.TIMED_WAITING;
//|| updateThread.getState() == Thread.State.WAITING return running && updateThread != null && updateState == Options.AppState.DELAYED;
//|| updateThread.getState() == Thread.State.BLOCKED;
} }
} }