diff --git a/ui/files.js b/ui/files.js index 0686ede6..2d720580 100755 --- a/ui/files.js +++ b/ui/files.js @@ -842,7 +842,13 @@ function exportImagesTo(path, im_name, dir_name, size){ selection.sort(imageOrderCmp) var z = (('10e' + (selection.length + '').length) * 1 + '').slice(2) - var queue = [] + var res = $.Deferred() + var pool_size = 100 + var pool = makeDefferedPool(pool_size) + .depleted(function(){ + showStatusQ('Export: done.') + res.resolve() + }) // go through ribbons... for(var i=DATA.ribbons.length-1; i >= 0; i--){ @@ -860,67 +866,12 @@ function exportImagesTo(path, im_name, dir_name, size){ var o = selection.indexOf(gid) + '' dest = dest.replace('%i', (z + o).slice(o.length)) - queue.push([gid, path, dest, size]) + pool.enqueue(null, exportImageTo, [gid, path, dest, size]) } path = normalizePath(path +'/'+ dir_name) } - /* - var res = [] - // XXX pool this... - queue.forEach(function(e){ - res.push(exportImageTo.apply(null, e)) - }) - - return $.when.apply(null, res) - .done(function(){ - showStatusQ('Export: done.') - }) - */ - - // XXX make this generic... - var pool = [] - var pool_size = 100 - var res = $.Deferred() - - var enqueue = function(e){ - if(e == null){ - return - } - var worker = exportImageTo.apply(null, e) - .done(function(){ - // prepare remove self from pool... - var i = pool.indexOf(worker) - - // get the next queue item... - var next = queue.splice(0, 1)[0] - - // enqueue the next worker if it exists... - if(next != null){ - // replace self with next worker... - pool[i] = enqueue(next) - - // nothing in queue... - } else { - // remove self... - pool.splice(i, 1) - - // empty queue and empty pool mean we are done... - if(pool.length == 0){ - showStatusQ('Export: done.') - res.resolve() - } - } - }) - .fail(function(){ - var i = pool.indexOf(worker) - // remove self... - pool.splice(i, 1) - }) - return worker - } - pool = queue.splice(0, pool_size).map(enqueue) return res } diff --git a/ui/lib/jli.js b/ui/lib/jli.js index 15dd27fd..e6bce280 100755 --- a/ui/lib/jli.js +++ b/ui/lib/jli.js @@ -733,7 +733,7 @@ function makeDefferedPool(size){ queue: [], } - pool._done_handlers = [] + pool._deplete_handlers = [] pool._run = function(obj, func, args){ var that = this @@ -770,7 +770,7 @@ function makeDefferedPool(size){ // empty queue and empty pool mean we are done... if(pool.length == 0){ - that._done() + that._deplete() } } @@ -799,7 +799,7 @@ function makeDefferedPool(size){ return res } - pool._done(){ + pool._deplete(){ var that = this this._done_handlers.forEach(function(func){ func(that) @@ -814,8 +814,9 @@ function makeDefferedPool(size){ // start work if we have not already... this._fill() } - pool.done = function(func){ - this._done_handlers.push(func) + // This is called after the pool is populated and depleted... + pool.depleted = function(func){ + this._deplete_handlers.push(func) } return pool