154 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
			
		
		
	
	
			154 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
import * as cornerstone from 'cornerstone-core'
 | 
						|
var taskPool = [] // 请求池
 | 
						|
let numRequest = 0 // 正在执行数量
 | 
						|
const maxRequest = 30 // 可配置
 | 
						|
let taskTimer // 轮询的定时器
 | 
						|
var cachedTask = {} // 存放的任务数据
 | 
						|
 | 
						|
// 执行下载
 | 
						|
async function executeTask() {
 | 
						|
  if (taskPool.length > 0) {
 | 
						|
    // sortTaskPool()
 | 
						|
    var taskPromises = []
 | 
						|
    var requestNum = taskPool.length > maxRequest ? maxRequest : taskPool.length
 | 
						|
    for (let i = 0; i < requestNum; i++) {
 | 
						|
      const task = taskPool.shift()
 | 
						|
      if (!task) return
 | 
						|
      taskPromises.push((task.execute))
 | 
						|
    }
 | 
						|
    await Promise.all(taskPromises.map(task=>task()));
 | 
						|
    executeTask()
 | 
						|
 | 
						|
    // const taskPromises = [];
 | 
						|
    // const delay = 50
 | 
						|
    // for(let i = 0;i< taskPool.length; i++ ){
 | 
						|
    //   taskPromises.push(()=>cornerstone.loadAndCacheImage(taskPool[i].key))
 | 
						|
    // }
 | 
						|
    // for (let i = 0; i < taskPromises.length; i += maxRequest) {
 | 
						|
    //   const tasks = taskPromises.slice(i, i + maxRequest);
 | 
						|
    //   await Promise.all(tasks.map(task=>task()));
 | 
						|
    //   await new Promise(resolve => setTimeout(resolve, delay));
 | 
						|
    // }
 | 
						|
 | 
						|
 | 
						|
    // while (taskPool.length > 0) {
 | 
						|
      
 | 
						|
    //   var requestNum = taskPool.length > maxRequest ? maxRequest : taskPool.length
 | 
						|
    //   for (let i = 0; i < requestNum; i++) {
 | 
						|
    //     sortTaskPool()
 | 
						|
    //     const task = taskPool.shift()
 | 
						|
    //     if (!task) return
 | 
						|
    //     batchPromises.push(cornerstone.loadAndCacheImage(task.key))
 | 
						|
    //   }
 | 
						|
    //   await Promise.all(batchPromises);
 | 
						|
    // }
 | 
						|
  }else{
 | 
						|
    startTaskTimer()
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function sortTaskPool() {
 | 
						|
  if (taskPool.length > 0) {
 | 
						|
    taskPool.sort((a, b) =>  b.priority-a.priority )
 | 
						|
    
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
// 轮询检查请求池中是否有请求需要执行
 | 
						|
function startTaskTimer() {
 | 
						|
  // if(taskTimer){
 | 
						|
  //   clearInterval(taskTimer)
 | 
						|
  //   taskTimer = null
 | 
						|
  // }
 | 
						|
  // taskTimer = setInterval(() => {
 | 
						|
  //   if (taskPool.length > 0) {
 | 
						|
  //     stopTaskTimer()
 | 
						|
  //     executeTask()
 | 
						|
  //   }else{
 | 
						|
  //     return
 | 
						|
  //   }
 | 
						|
  // }, 50)
 | 
						|
  taskTimer = setInterval(() => {
 | 
						|
    if (taskPool.length > 0) {
 | 
						|
      stopTaskTimer()
 | 
						|
      executeTask()
 | 
						|
    }
 | 
						|
  }, 50)
 | 
						|
}
 | 
						|
 | 
						|
// 停止轮询
 | 
						|
function stopTaskTimer() {
 | 
						|
  clearInterval(taskTimer)
 | 
						|
  taskTimer = null
 | 
						|
}
 | 
						|
function loadAndCacheImagePlus(imageId,seriesId, priority) {
 | 
						|
  return new Promise((resolve, reject) => {
 | 
						|
    const imageLoadObject = cornerstone.imageCache.getImageLoadObject(imageId)
 | 
						|
    if (imageLoadObject) {
 | 
						|
      imageLoadObject.promise.then((image) => {
 | 
						|
        resolve(image)
 | 
						|
      }, (err) => {
 | 
						|
        reject(err)
 | 
						|
      })
 | 
						|
    } else {
 | 
						|
      const imageTask = buildImageRequestTask(imageId,seriesId, { priority })
 | 
						|
      // addTaskIntoPool(imageTask).then((res) => {
 | 
						|
      //   resolve(res)
 | 
						|
      // }).catch(e => {
 | 
						|
      //   reject(e)
 | 
						|
      // })
 | 
						|
      taskPool.push(imageTask)
 | 
						|
    }
 | 
						|
  })
 | 
						|
}
 | 
						|
// 预加载池的添加
 | 
						|
function addTaskIntoPool(task) {
 | 
						|
  taskPool.push(task)
 | 
						|
  sortTaskPool()
 | 
						|
}
 | 
						|
function removeTask(seriesId){
 | 
						|
  stopTaskTimer()
 | 
						|
  if (taskPool.length > 0) {
 | 
						|
    for(var i =taskPool.length-1; i>=0;i--){
 | 
						|
      if(taskPool[i] && taskPool[i].seriesId === seriesId){
 | 
						|
        delete cachedTask[taskPool[i].key]
 | 
						|
        taskPool.splice(i,1)
 | 
						|
       
 | 
						|
      }
 | 
						|
    }
 | 
						|
    
 | 
						|
  }
 | 
						|
  startTaskTimer()
 | 
						|
}
 | 
						|
function resetRequestPool(){
 | 
						|
  taskPool = []
 | 
						|
  pendingList =[]
 | 
						|
  cachedTask = {}
 | 
						|
}
 | 
						|
function resetCachedTask(){
 | 
						|
  taskPool = []
 | 
						|
  pendingList =[]
 | 
						|
  cachedTask = {}
 | 
						|
}
 | 
						|
function buildImageRequestTask(imageId,seriesId, config = {}) {
 | 
						|
  return {
 | 
						|
      key: imageId,
 | 
						|
      seriesId:seriesId,
 | 
						|
      ...config,
 | 
						|
      execute: () => {
 | 
						|
          return cornerstone.loadAndCacheImage(imageId)
 | 
						|
      }
 | 
						|
  };
 | 
						|
}
 | 
						|
 | 
						|
export default {
 | 
						|
  addTaskIntoPool,
 | 
						|
  executeTask,
 | 
						|
  startTaskTimer,
 | 
						|
  stopTaskTimer,
 | 
						|
  loadAndCacheImagePlus,
 | 
						|
  removeTask,
 | 
						|
  resetRequestPool,
 | 
						|
  resetCachedTask
 | 
						|
}
 |