avoid custom thread creation (IDEA-COMMUNITY-CR-873)
authorAlexander Marchuk <Alexander.Marchuk@jetbrains.com>
Thu, 30 Oct 2014 11:59:02 +0000 (14:59 +0300)
committerAlexander Marchuk <Alexander.Marchuk@jetbrains.com>
Thu, 30 Oct 2014 11:59:02 +0000 (14:59 +0300)
python/src/com/jetbrains/python/debugger/array/NumpyArrayValueProvider.java
python/src/com/jetbrains/python/debugger/array/PagingTableModel.java

index c2a23c9892c7157da558eaf00ef3b7a890961ed3..fd98c5fc7d0d2174b189f8173296d54a316788e7 100644 (file)
@@ -58,7 +58,7 @@ public class NumpyArrayValueProvider extends ArrayValueProvider {
   private int[] myShape;
   private ArrayTableCellRenderer myTableCellRenderer;
   private PagingTableModel myPagingModel;
-  private boolean lastFinished = false;
+  private boolean lastSuccessful = false;
 
   private final static int COLUMNS_IN_DEFAULT_SLICE = 40;
   private final static int ROWS_IN_DEFAULT_SLICE = 40;
@@ -123,21 +123,7 @@ public class NumpyArrayValueProvider extends ArrayValueProvider {
                   if (!myBaseSlice.equals(getModelFullChunk().getBaseSlice()) || !myFormat.equals(getModelFullChunk().getFormat())) {
                     return;
                   }
-
-                  myLastPresentation = arraySlice;
-                  lastFinished = true;
-                  getPendingSet().remove(chunk);
-                  notifyNextThread();
-                  fireTableCellUpdated(chunk.getRowOffset(), chunk.getColOffset());
-                  DebuggerUIUtil.invokeLater(new Runnable() {
-                    public void run() {
-                      addDataInCache(arraySlice.getRowOffset(), arraySlice.getColOffset(), arraySlice.getData());
-
-                      myTable.setDefaultEditor(myTable.getColumnClass(0), getArrayTableCellEditor());
-                      myTable.setDefaultRenderer(myTable.getColumnClass(0), myTableCellRenderer);
-                      myDialog.setTitle(getTitlePresentation(getSliceText()));
-                    }
-                  });
+                  notifyChunkLoaded(arraySlice);
                 }
               });
             }
@@ -291,6 +277,9 @@ public class NumpyArrayValueProvider extends ArrayValueProvider {
         myComponent.getSliceTextField().setText(getDefaultPresentation());
         myComponent.getFormatTextField().setText(getDefaultFormat());
         myDialog.setTitle(getTitlePresentation(getDefaultPresentation()));
+        if (myTable.getColumnCount() > 0) {
+          myTable.setDefaultEditor(myTable.getColumnClass(0), getArrayTableCellEditor());
+        }
       }
     });
     startFillTable(new NumpyArraySlice(getDefaultPresentation(), Math.min(getMaxRow(myShape), ROWS_IN_DEFAULT_VIEW),
@@ -488,11 +477,11 @@ public class NumpyArrayValueProvider extends ArrayValueProvider {
   private void startFillTable(final NumpyArraySlice arraySlice, boolean rendered, final boolean inPlace) {
     if (myLastPresentation != null &&
         arraySlice.getBaseSlice().equals(myLastPresentation.getBaseSlice()) &&
-        arraySlice.getFormat().equals(myLastPresentation.getFormat()) && lastFinished) {
+        arraySlice.getFormat().equals(myLastPresentation.getFormat()) && lastSuccessful) {
       return;
     }
 
-    lastFinished = false;
+    lastSuccessful = false;
     myPagingModel = getPagingModel(myShape, rendered, arraySlice);
 
     DebuggerUIUtil.invokeLater(new Runnable() {
@@ -782,8 +771,22 @@ public class NumpyArrayValueProvider extends ArrayValueProvider {
     return 0;
   }
 
-  public void notifyNextThread() {
-    myPagingModel.runNextThread();
+  public void notifyChunkLoaded(final NumpyArraySlice arraySlice) {
+    myLastPresentation = arraySlice;
+    lastSuccessful = true;
+    myPagingModel.addDataInCache(arraySlice.getRowOffset(), arraySlice.getColOffset(), arraySlice.getData());
+    myPagingModel.runNextLoadingTask();
+    DebuggerUIUtil.invokeLater(new Runnable() {
+      public void run() {
+        myTable.setDefaultRenderer(myTable.getColumnClass(0), myTableCellRenderer);
+        myDialog.setTitle(getTitlePresentation(getSliceText()));
+        for (int r = 0; r < arraySlice.getRows(); r++) {
+          for (int c = 0; c < arraySlice.getColumns(); c++) {
+            myPagingModel.fireTableCellUpdated(r + arraySlice.getRowOffset(), c + arraySlice.getColOffset());
+          }
+        }
+      }
+    });
   }
 
   public void setBusy(final boolean busy) {
index 975cb4d4b75c18f70eff126bc732be1b3cffa522..7d020568c15e1bed7dc6a55f2cb88033ab965f27 100644 (file)
@@ -15,6 +15,7 @@
  */
 package com.jetbrains.python.debugger.array;
 
+import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.ui.components.JBScrollPane;
 import com.intellij.ui.components.JBViewport;
 import com.intellij.util.containers.HashMap;
@@ -22,7 +23,6 @@ import com.intellij.util.containers.Queue;
 
 import javax.swing.table.AbstractTableModel;
 import java.awt.*;
-import java.util.LinkedList;
 import java.util.SortedSet;
 import java.util.TreeSet;
 
@@ -36,8 +36,7 @@ public abstract class PagingTableModel extends AbstractTableModel {
   private SortedSet<ArrayChunk> myPendingSet = new TreeSet<ArrayChunk>();
   private Queue<String> cachedChunkKeys = new Queue<String>(DEFAULT_MAX_CACHED_SIZE + 1);
 
-  private LinkedList<Thread> myThreadList = new LinkedList<Thread>();
-  private Thread evaluatedThread;
+  private ArrayChunk evaluatedChunk;
 
   private boolean myRendered;
   private int myRows = 0;
@@ -130,15 +129,15 @@ public abstract class PagingTableModel extends AbstractTableModel {
 
   protected abstract Runnable getDataEvaluator(final ArrayChunk chunk);
 
-  public void runNextThread() {
-    if (evaluatedThread != null) {
-      myThreadList.remove(evaluatedThread);
-      evaluatedThread = null;
+  public void runNextLoadingTask() {
+    if (evaluatedChunk != null) {
+      myPendingSet.remove(evaluatedChunk);
+      evaluatedChunk = null;
     }
 
-    if (myThreadList.size() > 0) {
-      evaluatedThread = myThreadList.get(0);
-      evaluatedThread.start();
+    if (myPendingSet.size() > 0) {
+      evaluatedChunk = myPendingSet.first();
+      ApplicationManager.getApplication().executeOnPooledThread(getDataEvaluator(evaluatedChunk));
       myProvider.setBusy(true);
     }
     else {
@@ -150,11 +149,8 @@ public abstract class PagingTableModel extends AbstractTableModel {
     final ArrayChunk segment = createChunk(rLength, cLength, rOffset, cOffset);
     myPendingSet.add(segment);
 
-    Runnable evaluator = getDataEvaluator(segment);
-    final Thread evalThread = new Thread(evaluator);
-    myThreadList.add(evalThread);
-    if (evaluatedThread == null) {
-      runNextThread();
+    if (evaluatedChunk == null) {
+      runNextLoadingTask();
     }
   }
 
@@ -167,12 +163,6 @@ public abstract class PagingTableModel extends AbstractTableModel {
       String old = cachedChunkKeys.pullFirst();
       myCachedData.remove(old);
     }
-
-    for (int r = 0; r < newData.length; r++) {
-      for (int c = 0; c < newData[0].length; c++) {
-        fireTableCellUpdated(r + rOffset, c + cOffset);
-      }
-    }
   }
 
   public int getColumnCount() {
@@ -187,19 +177,11 @@ public abstract class PagingTableModel extends AbstractTableModel {
     return myRows;
   }
 
-  public SortedSet<ArrayChunk> getPendingSet() {
-    return myPendingSet;
-  }
-
   public void clearCached() {
     myCachedData = new HashMap<String, Object[][]>();
     myPendingSet = new TreeSet<ArrayChunk>();
     cachedChunkKeys = new Queue<String>(DEFAULT_MAX_CACHED_SIZE + 1);
-    if (evaluatedThread != null) {
-      evaluatedThread.interrupt();
-    }
-    evaluatedThread = null;
-    myThreadList = new LinkedList<Thread>();
+    evaluatedChunk = null;
   }
 
   public static class LazyViewport extends JBViewport {