commit 6613266b321cd1d173c1a1e6ab85676f9cd3a174
Author: Leszek Koltunski <leszek@distorted.org>
Date:   Wed Jun 22 01:12:49 2016 +0100

    Major: the MessageSender thread used to be running all the time in a tight loop!!

diff --git a/src/main/java/org/distorted/library/EffectMessageSender.java b/src/main/java/org/distorted/library/EffectMessageSender.java
index 5676c8c..9e7bb20 100644
--- a/src/main/java/org/distorted/library/EffectMessageSender.java
+++ b/src/main/java/org/distorted/library/EffectMessageSender.java
@@ -50,8 +50,8 @@ final class EffectMessageSender extends Thread
   
   private static Vector<Message> mList =null;
   private static EffectMessageSender mThis=null;
-  private static volatile boolean mPaused;
-  
+  private static volatile boolean mNotify = false;
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
    
   private EffectMessageSender() 
@@ -62,8 +62,6 @@ final class EffectMessageSender extends Thread
 
   static void startSending()
     {
-    mPaused = false;
-       
     if( mThis==null )
       {
       mList = new Vector<>();
@@ -83,7 +81,7 @@ final class EffectMessageSender extends Thread
   
   static void stopSending()
     {
-    mPaused = true;  
+
     }
   
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -94,20 +92,22 @@ final class EffectMessageSender extends Thread
      
     while(true)
       {
-      if( mList.size()>0 )
+      //android.util.Log.d("SENDER", "running...");
+
+      while( mList.size()>0 )
         {
-        tmp = mList.get(0); 
+        tmp = mList.remove(0);
         tmp.mListener.effectMessage(tmp.mMessage, tmp.mEffectID, tmp.mEffectName, tmp.mBitmapID, tmp.mStr);
-        mList.remove(0);
         }
-     
-      if( mPaused ) 
+
+      synchronized(mThis)
         {
-        synchronized(mThis)
+        if (!mNotify)
           {
           try  { mThis.wait(); }
           catch(InterruptedException ex) { }
           }
+        mNotify = false;
         }
       }
     }
@@ -116,10 +116,13 @@ final class EffectMessageSender extends Thread
         
   static void newMessage(EffectListener l, EffectMessage m, long id, int name, long bmpID, String str)
     {
-    if( mThis!=null )
+    Message msg = mThis.new Message(l,m,id,name,bmpID,str);
+    mList.add(msg);
+
+    synchronized(mThis)
       {
-      Message msg = mThis.new Message(l,m,id,name,bmpID,str);
-      mList.add(msg);
+      mNotify = true;
+      mThis.notify();
       }
     }
   }
diff --git a/src/main/java/org/distorted/library/message/EffectListener.java b/src/main/java/org/distorted/library/message/EffectListener.java
index 864e43a..d2b49ec 100644
--- a/src/main/java/org/distorted/library/message/EffectListener.java
+++ b/src/main/java/org/distorted/library/message/EffectListener.java
@@ -21,28 +21,26 @@ package org.distorted.library.message;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-import org.distorted.library.DistortedBitmap;
 import org.distorted.library.EffectNames;
 
 /**
  * This interface lets users of the Distorted library get notified when something happens to one of the effects.
- * To receive the notifications, we first have to register with a call to {@link DistortedBitmap#addEventListener(EffectListener)}.
+ * To receive the notifications, we first have to register with a call to {@link org.distorted.library.DistortedObject#addEventListener(EffectListener)}.
  * List of all possible events that can happen is defined in {@link EffectMessage}
  */
 
 public interface EffectListener 
   {
 /**
- * Gets called when event of type 'em' happens to effect 'effectID'. 
+ * Gets called when event of type 'eventType' happens to effect 'effectID'.
  * 
  * @param eventType  Type of event that happened.
  * @param effectID   ID of the effect the event happened to. This ID must have been previously returned by one
- *                   of the DistortedBitmap.{deform,distort,move,...} functions.
- * @param effectName Name of the effect as defined in EffectNames, e.g. if effectType==EffectNames.MOVE.ordinal(),
- *                   then the event happened to a MOVE effect.
- * @param bitmapID   the ID of the DistortedBitmap object, as returned by {@link DistortedBitmap#getID()}, this event
- *                   happened to. If the object has been created using a copy constructor from another instance of
- *                   DistortedBitmap, the ID here will be the one of the original object.
+ *                   of the DistortedObject.{deform,distort,move,...} functions.
+ * @param effectName Name of the effect as defined by EffectNames.ordinal()
+ * @param bitmapID   the ID of the DistortedObject object, as returned by {@link org.distorted.library.DistortedObject#getID()},
+ *                   this event happened to. If the Object has been created using a copy constructor
+ *                   from another instance of DistortedObject, the ID here will be the one of the original object.
  * @param message    Any message string associated with it. 'Failed' event types have one.
  * @see EffectMessage
  * @see EffectNames
