Added asynchronous rendering
authorBill Kuker <bkuker@billkuker.com>
Wed, 1 Jul 2009 02:37:38 +0000 (02:37 +0000)
committerBill Kuker <bkuker@billkuker.com>
Wed, 1 Jul 2009 02:37:38 +0000 (02:37 +0000)
src/com/billkuker/rocketry/motorsim/visual/Chart.java

index 5f5a6487479cfd78eb4de907573b5478343b22c1..db1a939b0222b93a46dbda2a70407dee3c8e7d07 100644 (file)
@@ -5,6 +5,8 @@ import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;\r
 import java.util.Collection;\r
 import java.util.Iterator;\r
+import java.util.concurrent.ExecutorService;\r
+import java.util.concurrent.Executors;\r
 \r
 import javax.measure.quantity.Area;\r
 import javax.measure.quantity.Length;\r
@@ -30,6 +32,9 @@ import com.billkuker.rocketry.motorsim.grain.CoredCylindricalGrain;
 \r
 public class Chart<X extends Quantity, Y extends Quantity> extends JPanel  {\r
        private static final long serialVersionUID = 1L;\r
+       \r
+       private static ExecutorService fast = Executors.newFixedThreadPool(2) ;\r
+       private static ExecutorService slow = Executors.newFixedThreadPool(2);\r
 \r
        public class IntervalDomain implements Iterable<Amount<X>>{\r
                \r
@@ -123,34 +128,55 @@ public class Chart<X extends Quantity, Y extends Quantity> extends JPanel  {
                }\r
        }\r
 \r
+\r
+       public void setDomain(final Iterable<Amount<X>> d) {\r
+               series.clear();\r
+               fill(d, 100);\r
+               fast.submit(new Thread(){\r
+                       public void run(){\r
+                               fill(d, 10);\r
+                       }\r
+               });\r
+               slow.submit(new Thread(){\r
+                       public void run(){\r
+                               fill(d, 1);\r
+                       }\r
+               });\r
+       }\r
+       \r
        @SuppressWarnings("unchecked")\r
-       public void setDomain(Iterable<Amount<X>> d) {\r
-               int skip = 1;\r
+       private void fill(Iterable<Amount<X>> d, int skip) {\r
                int sz = 0;\r
-               if ( d instanceof Collection ){\r
-                       sz = ((Collection)d).size();\r
-                       if ( sz > 200 )\r
-                               skip = sz / 200;\r
+               if (d instanceof Collection) {\r
+                       sz = ((Collection) d).size();\r
+                       int sk2 = sz / 200;\r
+                       if (skip < sk2)\r
+                               skip = sk2;\r
                }\r
-               series.clear();\r
+               // series.clear();\r
                int cnt = 0;\r
-               for( Amount<X> ax: d){\r
-                       try {\r
-                               if ( cnt % skip == 0 || cnt == sz-1 ){\r
-                                       Amount<Y> y = (Amount<Y>)f.invoke(source, ax);\r
+\r
+               try {\r
+                       Amount<X> last = null;\r
+                       for (Amount<X> ax : d) {\r
+                               last = ax;\r
+                               if (cnt % skip == 0) {\r
+                                       Amount<Y> y = (Amount<Y>) f.invoke(source, ax);\r
                                        add(ax, y);\r
                                }\r
                                cnt++;\r
-                       } catch (IllegalArgumentException e) {\r
-                               // TODO Auto-generated catch block\r
-                               e.printStackTrace();\r
-                       } catch (IllegalAccessException e) {\r
-                               // TODO Auto-generated catch block\r
-                               e.printStackTrace();\r
-                       } catch (InvocationTargetException e) {\r
-                               // TODO Auto-generated catch block\r
-                               e.printStackTrace();\r
                        }\r
+                       Amount<Y> y = (Amount<Y>) f.invoke(source, last);\r
+                       add(last, y);\r
+               } catch (IllegalArgumentException e) {\r
+                       // TODO Auto-generated catch block\r
+                       e.printStackTrace();\r
+               } catch (IllegalAccessException e) {\r
+                       // TODO Auto-generated catch block\r
+                       e.printStackTrace();\r
+               } catch (InvocationTargetException e) {\r
+                       // TODO Auto-generated catch block\r
+                       e.printStackTrace();\r
                }\r
        }\r
 \r