Changeset 3506


Ignore:
Timestamp:
12/28/07 12:33:35 (12 years ago)
Author:
melissa
Message:

Added caching thread to data browser and fixed a few bugs in CacheIndicator.

Location:
trunk/loci
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/formats/cache/Cache.java

    r3355 r3506  
    4848  protected Vector listeners; 
    4949 
     50  /** Whether or not we want to manually update the cache. */ 
     51  protected boolean manualUpdate; 
     52 
    5053  // -- Constructors -- 
    5154 
    5255  /** Constructs an object cache with the given cache strategy and source. */ 
    53   public Cache(ICacheStrategy strategy, ICacheSource source) 
    54     throws CacheException 
     56  public Cache(ICacheStrategy strategy, ICacheSource source, 
     57    boolean manualUpdate) throws CacheException 
    5558  { 
    5659    if (strategy == null) throw new CacheException("strategy is null"); 
     
    5861    this.strategy = strategy; 
    5962    this.source = source; 
     63    this.manualUpdate = manualUpdate; 
    6064    listeners = new Vector(); 
    6165    reset(); 
     
    118122    notifyListeners(new CacheEvent(this, CacheEvent.STRATEGY_CHANGED)); 
    119123    reset(); 
    120     recache(); 
     124    if (!manualUpdate) recache(); 
    121125  } 
    122126 
     
    127131    notifyListeners(new CacheEvent(this, CacheEvent.SOURCE_CHANGED)); 
    128132    reset(); 
    129     recache(); 
     133    if (!manualUpdate) recache(); 
    130134  } 
    131135 
     
    147151    int ndx = FormatTools.positionToRaster(len, pos); 
    148152    notifyListeners(new CacheEvent(this, CacheEvent.POSITION_CHANGED, ndx)); 
    149     recache(); 
     153    if (!manualUpdate) recache(); 
     154  } 
     155 
     156  /** Updates the given plane. */ 
     157  public void recache(int n) throws CacheException { 
     158    int[][] indices = strategy.getLoadList(currentPos); 
     159    int[] len = strategy.getLengths(); 
     160 
     161    for (int i=0; i<inCache.length; i++) { 
     162      boolean found = false; 
     163      for (int j=0; j<indices.length; j++) { 
     164        if (i == FormatTools.positionToRaster(len, indices[j])) { 
     165          found = true; 
     166          break; 
     167        } 
     168      } 
     169      if (!found) { 
     170        inCache[i] = false; 
     171        if (cache[i] != null) { 
     172          cache[i] = null; 
     173          notifyListeners(new CacheEvent(this, CacheEvent.OBJECT_DROPPED, i)); 
     174        } 
     175      } 
     176    } 
     177 
     178    int ndx = FormatTools.positionToRaster(len, indices[n]); 
     179    if (ndx >= 0) inCache[ndx] = true; 
     180 
     181    if (cache[ndx] == null) { 
     182      cache[ndx] = source.getObject(ndx); 
     183      notifyListeners(new CacheEvent(this, CacheEvent.OBJECT_LOADED, ndx)); 
     184    } 
    150185  } 
    151186 
     
    193228    // 
    194229    // /lo 
    195     int[][] indices = strategy.getLoadList(currentPos); 
    196     int[] len = strategy.getLengths(); 
    197  
    198     Arrays.fill(inCache, false); 
    199     for (int i=0; i<indices.length; i++) { 
    200       int ndx = FormatTools.positionToRaster(len, indices[i]); 
    201       if (ndx >= 0) inCache[ndx] = true; 
    202     } 
    203  
    204     for (int i=0; i<cache.length; i++) { 
    205       if (!inCache[i] && cache[i] != null) { 
    206         cache[i] = null; 
    207         notifyListeners(new CacheEvent(this, CacheEvent.OBJECT_DROPPED, i)); 
    208       } 
    209     } 
    210  
    211     for (int i=0; i<indices.length; i++) { 
    212       int ndx = FormatTools.positionToRaster(len, indices[i]); 
    213       if (cache[ndx] == null) { 
    214         cache[ndx] = source.getObject(ndx); 
    215         notifyListeners(new CacheEvent(this, CacheEvent.OBJECT_LOADED, ndx)); 
    216       } 
     230    for (int i=0; i<strategy.getLoadList(currentPos).length; i++) { 
     231      recache(i); 
    217232    } 
    218233  } 
     
    243258    final Cache cache = new Cache( 
    244259      new CrosshairStrategy(getLengths(reader)), 
    245       new BufferedImageSource(reader)); 
     260      new BufferedImageSource(reader), false); 
    246261    CacheListener l = new CacheListener() { 
    247262      public void cacheUpdated(CacheEvent e) { 
  • trunk/loci/plugins/browser/CacheIndicator.java

    r3362 r3506  
    6060    cacheLength = length; 
    6161    this.axis = axis; 
    62     numAxes = cache.getCurrentPos().length; 
     62    synchronized (cache) { 
     63      numAxes = cache.getCurrentPos().length; 
     64    } 
    6365    doUpdate = true; 
    6466    repaint(); 
     
    7779 
    7880    int pixelsPerIndex = getWidth() / cacheLength; 
     81    if (pixelsPerIndex * cacheLength < getWidth()) pixelsPerIndex++; 
    7982 
    8083    try { 
    81       int[] currentPos = cache.getCurrentPos(); 
    82       int[][] loadList = cache.getStrategy().getLoadList(currentPos); 
     84      int[] currentPos = null; 
     85      int[][] loadList = null; 
     86      synchronized (cache) { 
     87        currentPos = cache.getCurrentPos(); 
     88        loadList = cache.getStrategy().getLoadList(currentPos); 
     89      } 
    8390 
    8491      int[] pos = new int[currentPos.length]; 
     
    103110        } 
    104111 
    105         if (cache.isInCache(pos)) g.setColor(Color.BLUE); 
     112        boolean inCache = false; 
     113        synchronized (cache) { 
     114          inCache = cache.isInCache(pos); 
     115        } 
     116 
     117        if (inCache) g.setColor(Color.BLUE); 
    106118        else if (inLoadList) g.setColor(Color.RED); 
    107119        else g.setColor(Color.WHITE); 
    108         g.fillRect(i*pixelsPerIndex + 1, 1, pixelsPerIndex, getHeight() - 2); 
     120        int len = pixelsPerIndex; 
     121        if (i == cacheLength - 1) { 
     122          len = getWidth() - i*pixelsPerIndex - 2; 
     123        } 
     124        g.fillRect(i*pixelsPerIndex + 1, 1, len, getHeight() - 2); 
    109125      } 
    110126    } 
  • trunk/loci/plugins/browser/CustomWindow.java

    r3362 r3506  
    354354 
    355355        try { 
    356           db.cache.setCurrentPos(newZCT); 
    357  
    358           // update cache indicators 
    359           if (zIndicator != null) { 
    360             zIndicator.setIndicator(db.cache, db.reader.getSizeZ(), zIndex); 
     356          synchronized (db.cache) { 
     357            db.cache.setCurrentPos(newZCT); 
    361358          } 
    362           if (tIndicator != null) { 
    363             tIndicator.setIndicator(db.cache, db.reader.getSizeT(), tIndex); 
     359          if (db.cacheThread != null) db.cacheThread.quit(); 
     360          db.cacheThread = new CacheUpdater(db.cache, 
     361            new CacheIndicator[] {zIndicator, tIndicator}, 
     362            new int[] {db.reader.getSizeZ(), db.reader.getSizeT()}, 
     363            new int[] {zIndex, tIndex}); 
     364          db.cacheThread.start(); 
     365 
     366          while (processors[i] == null) { 
     367            synchronized (db.cache) { 
     368              processors[i] = (ImageProcessor) db.cache.getObject(newZCT); 
     369            } 
    364370          } 
    365  
    366           processors[i] = (ImageProcessor) db.cache.getObject(newZCT); 
    367371          if (!temp) { 
    368372            double bits = 255; 
     
    374378          if (i == numPlanes - 1) { 
    375379            newZCT[cIndex] -= (numPlanes - 1); 
    376             db.cache.setCurrentPos(newZCT); 
     380            synchronized (db.cache) { 
     381              db.cache.setCurrentPos(newZCT); 
     382            } 
     383            if (db.cacheThread != null) db.cacheThread.quit(); 
     384            db.cacheThread = new CacheUpdater(db.cache, 
     385              new CacheIndicator[] {zIndicator, tIndicator}, 
     386              new int[] {db.reader.getSizeZ(), db.reader.getSizeT()}, 
     387              new int[] {zIndex, tIndex}); 
     388            db.cacheThread.start(); 
    377389          } 
    378390        } 
     
    423435    int current = imp.getCurrentSlice(); 
    424436    if (db.cache != null) { 
    425       int[] zct = db.cache.getCurrentPos(); 
    426       current = FormatTools.positionToRaster( 
    427         db.cache.getStrategy().getLengths(), zct); 
    428       current++; 
     437      synchronized (db.cache) { 
     438        int[] zct = db.cache.getCurrentPos(); 
     439        current = FormatTools.positionToRaster( 
     440          db.cache.getStrategy().getLengths(), zct); 
     441        current++; 
     442      } 
    429443    } 
    430444    if (db.merged) { 
     
    487501    if (db.cache != null) { 
    488502      try { 
    489         stackSize = db.cache.getStrategy().getLoadList( 
    490           db.cache.getCurrentPos()).length; 
     503        synchronized (db.cache) { 
     504          stackSize = db.cache.getStrategy().getLoadList( 
     505            db.cache.getCurrentPos()).length; 
     506        } 
    491507      } 
    492508      catch (CacheException exc) { 
  • trunk/loci/plugins/browser/LociDataBrowser.java

    r3362 r3506  
    8484  protected int series; 
    8585 
     86  /** Thread for updating the cache. */ 
     87  protected CacheUpdater cacheThread; 
     88 
    8689  protected Cache cache; 
    8790  private ImageStack stack; 
     
    255258          strategy.setPriority(ICacheStrategy.MIN_PRIORITY, cAxis); 
    256259 
    257           cache = new Cache(strategy, source); 
    258           cache.setCurrentPos(new int[] {0, 0, 0}); 
     260          cache = new Cache(strategy, source, true); 
     261          synchronized (cache) { 
     262            cache.setCurrentPos(new int[] {0, 0, 0}); 
     263          } 
     264          if (cacheThread != null) cacheThread.quit(); 
     265          cacheThread = new CacheUpdater(cache, 
     266            new CacheIndicator[0], new int[0], new int[0]); 
     267          cacheThread.start(); 
    259268 
    260269          try { 
     
    266275            stack = new ImageStack(sizeX, sizeY); 
    267276            // CTR: must add at least one image to the stack 
    268             stack.addSlice(id + " : 1", 
    269               (ImageProcessor) cache.getObject(new int[] {0, 0, 0})); 
     277            ImageProcessor slice = null; 
     278            while (slice == null) { 
     279              synchronized (cache) { 
     280                slice = (ImageProcessor) cache.getObject(new int[] {0, 0, 0}); 
     281              } 
     282            } 
     283            stack.addSlice(id + " : 1", slice); 
    270284          } 
    271285          catch (OutOfMemoryError e) { 
  • trunk/loci/plugins/browser/OptionsWindow.java

    r3362 r3506  
    427427      // change cache strategy 
    428428 
    429       int[] lengths = cw.db.cache.getStrategy().getLengths(); 
    430       int ndx = modeBox.getSelectedIndex(); 
    431       try { 
    432         CacheStrategy strategy = ndx == 0 ? 
    433           (CacheStrategy) new CrosshairStrategy(lengths) : 
    434           (CacheStrategy) new RectangleStrategy(lengths); 
    435         cw.db.cache.setStrategy(strategy); 
    436       } 
    437       catch (CacheException exc) { 
    438         LociDataBrowser.dumpException(exc); 
     429      synchronized (cw.db.cache) { 
     430        int[] lengths = cw.db.cache.getStrategy().getLengths(); 
     431        int ndx = modeBox.getSelectedIndex(); 
     432        try { 
     433          CacheStrategy strategy = ndx == 0 ? 
     434            (CacheStrategy) new CrosshairStrategy(lengths) : 
     435            (CacheStrategy) new RectangleStrategy(lengths); 
     436          cw.db.cache.setStrategy(strategy); 
     437        } 
     438        catch (CacheException exc) { 
     439          LociDataBrowser.dumpException(exc); 
     440        } 
    439441      } 
    440442 
     
    455457      stratBox.setSelectedIndex(0); 
    456458 
    457       int[] lengths = cw.db.cache.getStrategy().getLengths(); 
    458       try { 
    459         cw.db.cache.setStrategy(new CrosshairStrategy(lengths)); 
    460       } 
    461       catch (CacheException exc) { 
    462         LociDataBrowser.dumpException(exc); 
    463       } 
    464  
    465       int[] priorities = new int[] {ICacheStrategy.NORMAL_PRIORITY, 
    466         ICacheStrategy.MAX_PRIORITY, ICacheStrategy.MIN_PRIORITY}; 
    467       int[] ranges = new int[] {0, 100, 0}; 
    468  
    469       for (int i=0; i<lengths.length; i++) { 
    470         cw.db.cache.getStrategy().setOrder(ICacheStrategy.FORWARD_ORDER, i); 
    471         cw.db.cache.getStrategy().setPriority(priorities[i], convert(i)); 
    472         cw.db.cache.getStrategy().setRange(ranges[i], convert(i)); 
     459      synchronized (cw.db.cache) { 
     460        int[] lengths = cw.db.cache.getStrategy().getLengths(); 
     461        try { 
     462          cw.db.cache.setStrategy(new CrosshairStrategy(lengths)); 
     463        } 
     464        catch (CacheException exc) { 
     465          LociDataBrowser.dumpException(exc); 
     466        } 
     467 
     468        int[] priorities = new int[] {ICacheStrategy.NORMAL_PRIORITY, 
     469          ICacheStrategy.MAX_PRIORITY, ICacheStrategy.MIN_PRIORITY}; 
     470        int[] ranges = new int[] {0, 100, 0}; 
     471 
     472        for (int i=0; i<lengths.length; i++) { 
     473          cw.db.cache.getStrategy().setOrder(ICacheStrategy.FORWARD_ORDER, i); 
     474          cw.db.cache.getStrategy().setPriority(priorities[i], convert(i)); 
     475          cw.db.cache.getStrategy().setRange(ranges[i], convert(i)); 
     476        } 
    473477      } 
    474478 
     
    625629    int[] ranges = new int[] {z, t, c}; 
    626630 
    627     ICacheStrategy strategy = cw.db.cache.getStrategy(); 
    628     for (int i=0; i<strategy.getLengths().length; i++) { 
    629       strategy.setRange(ranges[i], convert(i)); 
     631    synchronized (cw.db.cache) { 
     632      ICacheStrategy strategy = cw.db.cache.getStrategy(); 
     633      for (int i=0; i<strategy.getLengths().length; i++) { 
     634        strategy.setRange(ranges[i], convert(i)); 
     635      } 
    630636    } 
    631637  } 
    632638 
    633639  private void updatePriorities() { 
    634     cw.db.cache.getStrategy().setPriority(ICacheStrategy.MAX_PRIORITY, 
    635       convert(topBox.getSelectedIndex())); 
    636     cw.db.cache.getStrategy().setPriority(ICacheStrategy.NORMAL_PRIORITY, 
    637       convert(midBox.getSelectedIndex())); 
    638     cw.db.cache.getStrategy().setPriority(ICacheStrategy.MIN_PRIORITY, 
    639       convert(lowBox.getSelectedIndex())); 
     640    synchronized (cw.db.cache) { 
     641      cw.db.cache.getStrategy().setPriority(ICacheStrategy.MAX_PRIORITY, 
     642        convert(topBox.getSelectedIndex())); 
     643      cw.db.cache.getStrategy().setPriority(ICacheStrategy.NORMAL_PRIORITY, 
     644        convert(midBox.getSelectedIndex())); 
     645      cw.db.cache.getStrategy().setPriority(ICacheStrategy.MIN_PRIORITY, 
     646        convert(lowBox.getSelectedIndex())); 
     647    } 
    640648  } 
    641649 
     
    643651    int cacheOrder = stratBox.getSelectedIndex() == 0 ? 
    644652      ICacheStrategy.FORWARD_ORDER : ICacheStrategy.CENTERED_ORDER; 
    645     for (int i=0; i<cw.db.cache.getStrategy().getLengths().length; i++) { 
    646       cw.db.cache.getStrategy().setOrder(cacheOrder, i); 
     653    synchronized (cw.db.cache) { 
     654      for (int i=0; i<cw.db.cache.getStrategy().getLengths().length; i++) { 
     655        cw.db.cache.getStrategy().setOrder(cacheOrder, i); 
     656      } 
    647657    } 
    648658  } 
Note: See TracChangeset for help on using the changeset viewer.