summaryrefslogtreecommitdiffstats
path: root/src/jogl/classes/com/sun/opengl/util
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2009-10-10 04:24:26 -0700
committerSven Gothel <[email protected]>2009-10-10 04:24:26 -0700
commit2268a6ce8a900ae7aa9f20d5f595f811185574a9 (patch)
treeb4426ed20e1957bd5cba095d5a036df2bbc1736a /src/jogl/classes/com/sun/opengl/util
parent20c6d89bfc4f72144b8bcc48839da7ef9bc40681 (diff)
NEWT: Add EventDispatchThread (EDT) pattern.
Due to limitations on Windows, we need to standardize the one thread for - window creation, and - event dispatching This was already mentioned in the previous implementation but while integrating into another threading model (Plugin3), it turned out that manual managing the thread is too much of a burden. NEWT now uses a EDT per Display and Thread as the default, where Display creation, Window creation and event dispatching is 'pipelined' into. This can be switched off: NewtFactory.setUseEDT(boolean onoff); and queried via: NewtFactory.useEDT(); Note this EDT impl. does not implicate a global lock or whatsoever. The experimantal semantics of a current GL context for input event dispatching is removed, i.e. the GL context is no more made current for mouse/key listener. This reduces the complexity and allows the proper impl. of the external dispatch via EDT .. for example. Removed: GLWindow: setEventHandlerMode(int) .. etc X11Display: XLockDisplay/XUnlockDisplay needed to be utilized to allow the new multithreading (EDT/Render) Display usage. X11Window: lockSurface/unlockSurface locks X11Display as well .. +++++ NEWT: 'getSurfaceHandle()' semantics changed. To allow usage of the surfaceHandle for OS where it is allocated thread local (MS-Windows), it shall be aquired/released while lockSurface/unlockSurface. This is done in the Windows Window implementation. GLWindow can no more query 'getSurfaceHandle()' to verify if 'setRealized()' was successful. NEWT: Window surface lock is recursive and blocking now, as it shall be.
Diffstat (limited to 'src/jogl/classes/com/sun/opengl/util')
-rwxr-xr-xsrc/jogl/classes/com/sun/opengl/util/Animator.java34
1 files changed, 31 insertions, 3 deletions
diff --git a/src/jogl/classes/com/sun/opengl/util/Animator.java b/src/jogl/classes/com/sun/opengl/util/Animator.java
index 84637433e..a10717881 100755
--- a/src/jogl/classes/com/sun/opengl/util/Animator.java
+++ b/src/jogl/classes/com/sun/opengl/util/Animator.java
@@ -53,28 +53,46 @@ import javax.media.opengl.*;
*/
public class Animator {
+ protected static final boolean DEBUG = com.sun.opengl.impl.Debug.debug("Animator");
+
private volatile ArrayList/*<GLAutoDrawable>*/ drawables = new ArrayList();
private AnimatorImpl impl;
private Runnable runnable;
private boolean runAsFastAsPossible;
+ protected ThreadGroup threadGroup;
protected Thread thread;
protected volatile boolean shouldStop;
protected boolean ignoreExceptions;
protected boolean printExceptions;
/** Creates a new, empty Animator. */
- public Animator() {
+ public Animator(ThreadGroup tg) {
try {
// Try to use the AWT-capable Animator implementation by default
impl = (AnimatorImpl) Class.forName("com.sun.opengl.util.awt.AWTAnimatorImpl").newInstance();
} catch (Exception e) {
impl = new AnimatorImpl();
}
+ threadGroup = tg;
+
+ if(DEBUG) {
+ System.out.println("Animator created, ThreadGroup: "+threadGroup);
+ }
+ }
+
+ public Animator() {
+ this((ThreadGroup)null);
}
/** Creates a new Animator for a particular drawable. */
public Animator(GLAutoDrawable drawable) {
- this();
+ this((ThreadGroup)null);
+ add(drawable);
+ }
+
+ /** Creates a new Animator for a particular drawable. */
+ public Animator(ThreadGroup tg, GLAutoDrawable drawable) {
+ this(tg);
add(drawable);
}
@@ -134,6 +152,9 @@ public class Animator {
class MainLoop implements Runnable {
public void run() {
try {
+ if(DEBUG) {
+ System.out.println("Animator started: "+Thread.currentThread());
+ }
while (!shouldStop) {
// Don't consume CPU unless there is work to be done
if (drawables.size() == 0) {
@@ -152,6 +173,9 @@ public class Animator {
Thread.yield();
}
}
+ if(DEBUG) {
+ System.out.println("Animator stopped: "+Thread.currentThread());
+ }
} finally {
shouldStop = false;
synchronized (Animator.this) {
@@ -170,7 +194,11 @@ public class Animator {
if (runnable == null) {
runnable = new MainLoop();
}
- thread = new Thread(runnable);
+ if(null==threadGroup) {
+ thread = new Thread(runnable);
+ } else {
+ thread = new Thread(threadGroup, runnable);
+ }
thread.start();
}