211 lines
5.5 KiB
Plaintext
211 lines
5.5 KiB
Plaintext
import * as cornerstone from 'cornerstone-core'
|
|
const taskPool = [] // 请求池
|
|
let numRequest = 0 // 正在执行数量
|
|
const maxRequest = 6 // 可配置
|
|
let taskTimer // 轮询的定时器
|
|
var pendingList =[]
|
|
const cachedTask = {} // 存放的任务数据
|
|
const maxTask = 6
|
|
// var currentAutoLoadTaskStauts = false
|
|
|
|
|
|
// 预加载池的添加
|
|
function addTaskIntoPool(task) {
|
|
return new Promise((resolve, reject) => {
|
|
taskPool.forEach(task=>{
|
|
task.priority = task.priority
|
|
})
|
|
const cache = cachedTask[task.key]
|
|
const callback = (executeRes) => {
|
|
if (executeRes.success) {
|
|
resolve(executeRes.res)
|
|
} else {
|
|
reject(executeRes.err)
|
|
}
|
|
}
|
|
const priority = task.priority || 0;
|
|
if (cache) {
|
|
cache.priority = priority
|
|
task.callback =callback
|
|
} else {
|
|
task.callback =callback
|
|
cachedTask[task.key] = task
|
|
taskPool.push(task)
|
|
}
|
|
})
|
|
}
|
|
// 执行下载
|
|
function executeTask() {
|
|
if (taskPool.length > 0) {
|
|
// console.log(numRequest)
|
|
numRequest = 0
|
|
const executeRequest = maxRequest - numRequest
|
|
|
|
if (executeRequest > 0) {
|
|
|
|
for (let i = 0; i < executeRequest; i++) {
|
|
sortTaskPool()
|
|
|
|
const task = taskPool.shift()
|
|
if (!task) {
|
|
return
|
|
}
|
|
numRequest++
|
|
task.execute().then((res) => {
|
|
numRequest--
|
|
task.callback({ success: true, res })
|
|
executeTask()
|
|
}, (err) => {
|
|
numRequest--
|
|
task.callback({ success: false,err })
|
|
// delete cachedTask[task.key]
|
|
executeTask()
|
|
})
|
|
}
|
|
}
|
|
} else if(pendingList.length > 0) {
|
|
putPendingTaskIntoPool()
|
|
executeTask()
|
|
}else{
|
|
startTaskTimer()
|
|
}
|
|
}
|
|
function sortTaskPool() {
|
|
if (taskPool.length > 0) {
|
|
taskPool.sort((a, b) => b.priority-a.priority )
|
|
|
|
}
|
|
}
|
|
|
|
// 轮询检查请求池中是否有请求需要执行
|
|
function startTaskTimer() {
|
|
taskTimer = setInterval(() => {
|
|
if (taskPool.length > 0) {
|
|
stopTaskTimer()
|
|
executeTask()
|
|
}else{
|
|
return
|
|
// if(currentAutoLoadTaskStauts) return
|
|
// 判断当前任务是否有序列未下载完成
|
|
// var visitTaskList = sessionStorage.getItem('visitTaskList')
|
|
// if(visitTaskList){
|
|
// visitTaskList = JSON.parse(visitTaskList)
|
|
// var idx = visitTaskList.findIndex(i => i.IsCurrentTask)
|
|
// var studyList = visitTaskList[idx].StudyList
|
|
// var series = getUnloadedSeries(studyList)
|
|
// if(series){
|
|
// var priority = Date.parse(new Date())
|
|
// series.imageIds.map(imageId => {
|
|
// loadAndCacheImagePlus(imageId,series.seriesId,priority)
|
|
// })
|
|
// }
|
|
// }
|
|
}
|
|
}, 50)
|
|
}
|
|
// function getUnloadedSeries(studyList){
|
|
// var series = null
|
|
// for(var i = 0;i<studyList.length;i++){
|
|
// var study = studyList[i]
|
|
// var idx = study.SeriesList.findIndex(s=>{
|
|
// var sliceThickness = isNaN(parseInt(s.sliceThickness)) ? null : parseInt(s.sliceThickness)
|
|
// return (sliceThickness === 5 || s.instanceCount < 100) && !s.loadStatus
|
|
// })
|
|
// if(idx > -1){
|
|
// series = study.SeriesList[idx]
|
|
// break
|
|
// }
|
|
// }
|
|
// if(!series){
|
|
// currentAutoLoadTaskStauts = true
|
|
// }
|
|
// return series
|
|
// }
|
|
// 停止轮询
|
|
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)
|
|
})
|
|
}
|
|
})
|
|
}
|
|
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 setPendingList(arr){
|
|
pendingList = [...arr]
|
|
pendingList.sort((a, b) => b.priority-a.priority )
|
|
}
|
|
function putPendingTaskIntoPool(){
|
|
if(pendingList.length > 0){
|
|
var tasks = pendingList.slice(0,maxTask)
|
|
tasks.forEach(task=>{
|
|
loadAndCacheImagePlus(task.imageId,task.seriesId,task.priority)
|
|
var idx = pendingList.findIndex(i=>i.imageId===task.imageId)
|
|
if(idx > -1){
|
|
pendingList.splice(idx,1)
|
|
}
|
|
|
|
})
|
|
}
|
|
}
|
|
// function updateTaskPriority(seriesId,priority){
|
|
// if (taskPool.length > 0) {
|
|
// for(var i =0; i<taskPool.length;i++){
|
|
// if(taskPool[i] && taskPool[i].seriesId === seriesId){
|
|
// taskPool[i].priority = priority
|
|
// }else{
|
|
// break
|
|
// }
|
|
// }
|
|
// }
|
|
// executeTask()
|
|
// }
|
|
function buildImageRequestTask(imageId,seriesId, config = {}) {
|
|
return {
|
|
key: imageId,
|
|
seriesId:seriesId,
|
|
...config,
|
|
execute: () => {
|
|
return cornerstone.loadAndCacheImage(imageId)
|
|
}
|
|
};
|
|
}
|
|
|
|
export default {
|
|
addTaskIntoPool,
|
|
executeTask,
|
|
startTaskTimer,
|
|
stopTaskTimer,
|
|
loadAndCacheImagePlus,
|
|
removeTask,
|
|
setPendingList
|
|
}
|