From da47617e9fb5c0e262119169853dc254b34991a9 Mon Sep 17 00:00:00 2001 From: gered Date: Wed, 16 Apr 2014 07:54:51 -0400 Subject: [PATCH] add a little extra safety to ensure the updater thread stops on dispose --- src/main/java/ca/blarg/gdx/tilemap3d/TileMap.java | 6 +++++- src/main/java/ca/blarg/gdx/tilemap3d/TileMapUpdater.java | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/ca/blarg/gdx/tilemap3d/TileMap.java b/src/main/java/ca/blarg/gdx/tilemap3d/TileMap.java index 6f49f13..c582148 100644 --- a/src/main/java/ca/blarg/gdx/tilemap3d/TileMap.java +++ b/src/main/java/ca/blarg/gdx/tilemap3d/TileMap.java @@ -15,6 +15,7 @@ public class TileMap extends TileContainer implements Disposable { final Vector3 tmpPosition = new Vector3(); TileMapUpdater updater; + Thread updaterThread; public final int chunkWidth; public final int chunkHeight; @@ -149,6 +150,7 @@ public class TileMap extends TileContainer implements Disposable { bounds.max.set(getWidth(), getHeight(), getDepth()); updater = new TileMapUpdater(this); + updaterThread = null; } public void updateVertices() { @@ -160,7 +162,8 @@ public class TileMap extends TileContainer implements Disposable { if (isUpdating()) throw new IllegalStateException("Async vertices update for this TileMap is currently underway."); - (new Thread(updater)).start(); + updaterThread = new Thread(updater); + updaterThread.start(); } public boolean updateVerticesAsync() { @@ -294,6 +297,7 @@ public class TileMap extends TileContainer implements Disposable { @Override public void dispose() { + updater.signalStop(); for (int i = 0; i < chunks.length; ++i) chunks[i].dispose(); } diff --git a/src/main/java/ca/blarg/gdx/tilemap3d/TileMapUpdater.java b/src/main/java/ca/blarg/gdx/tilemap3d/TileMapUpdater.java index a81df64..0ad8509 100644 --- a/src/main/java/ca/blarg/gdx/tilemap3d/TileMapUpdater.java +++ b/src/main/java/ca/blarg/gdx/tilemap3d/TileMapUpdater.java @@ -7,6 +7,7 @@ public class TileMapUpdater implements Runnable { TileChunk chunkNeedingVboCreation; float progress; boolean isRunning; + boolean needToStop; public TileMapUpdater(TileMap tileMap) { this.tileMap = tileMap; @@ -32,14 +33,17 @@ public class TileMapUpdater implements Runnable { waitingForVboCreation = false; } + public synchronized void signalStop() { needToStop = true; } + @Override public void run() { isRunning = true; chunkNeedingVboCreation = null; + needToStop = false; TileChunk[] chunks = tileMap.getChunks(); - for (int i = 0; i < tileMap.chunks.length; ++i) { + for (int i = 0; (i < tileMap.chunks.length && !needToStop); ++i) { progress = (float)i / (float)(chunks.length - 1); TileChunk chunk = chunks[i];