假设我有这一系列文件
20,21,22,23,24,...,35
我通过以下代码段将该系列分成了一些包:
for (var i = 0; i < _Thread_SerieLength; i++) {
if (data_Seriepack.instanceList[index] !== undefined) {
bachPack.push(data_Seriepack.instanceList[index]);
index = index + threadSerieCount;
}
}
所以pack1为20,24,28,32
,p2 = 21,25,29,33
,p3 = 22,26,30,34
,p4 = 23,27,31,35
在另一方面,我有一个名为js
的{{1}}文件作为工作线程
BlobDownloader将下载包Urls并将其插入BlobDownloader.js
,因此工作线程的代码为:
indexedDb
并且调用该工作人员:
self.onmessage = function (event) {
var dbObject = new ClientDataBase(event.data.dbName);
if (event.data != undefined) {
var Urls = event.data.pack;
Urls.forEach(function (url, index, arr) {
var xhr = new XMLHttpRequest(),
blob;
xhr.open("GET", url.imageId, false);
xhr.responseType = "arraybuffer";
xhr.addEventListener("load", function () {
if (xhr.status === 200) {
blob = xhr.response;
console.log("Befor added to DB:" + url.imageId);
dbObject.addRecord(url.imageId, url.imageIndex, event.data.serieUID, blob, blob.byteLength, "").then(function (e) {
console.log("After added to DB:" + e);
postMessage(e);
if (index == arr.length - 1) {
self.close();
}
});
}
}, false);
xhr.send();
});
}
}
所以4个线程将由 for (var j = 0; j < self.maxThreadNumber; j++) {
bachPack = [];
......
self.customThreadDownloader[j] = new Worker('../Scripts/Metric/Downloader/BlobDownloader.js');
var content = {
pack: bachPack,
dbName: dataBaseObject[self.Study.studyIndex].dbName,
dbVersion: dataBaseObject[self.Study.studyIndex].dbVersion,
serieUID: self.Tbox.id,
threadIndex: j
}
self.customThreadDownloader[j].postMessage(content);
self.customThreadDownloader[j].onmessage = function (evt) {
counterpack++;
var dataIndex = self.Urls.indexOf(evt.data);
console.log("> Added To DB: " + dataIndex);
}
....
}
循环并行运行
所以我期望的输出是:
for
但它有点不同:
21,22,23,24,25,26,27...35
=(p2,p4,p3,p1)
或
21,25,29,33,23,27,31,35,22,26,30,34,...
=(P1,P3,P2,P4)
这意味着一个线程运行直到完成,然后另一个线程运行结束,当我使用IndexedDB时似乎没有并行运行。
所以当我删除它时:
20,24,28,32,22,26,30,34,21,25,29,33,23,27,31,35
或在dbObject.addRecord(url.imageId, url.imageIndex, event.data.serieUID, blob, blob.byteLength, "").then(function (e) {
console.log("After added to DB:" + e);
// postMessage(e);
if (index == arr.length - 1) {
self.close();
}
});
之后调用postMessage(e);
一切正常。
在工作线程中使用IndexedDb有问题吗?
或者有办法实现这种情况吗?
提前致谢。