0
기본적으로 버퍼에서 만든 배열 (공유 할 필요가없는 배열)에 관계없이 배열의 요소 길이는 버퍼와 같지만 값은 0입니다. 참고 크롬에서이 작업을 수행해야하며 형식화 된 배열의 Mozilla 문서는 크롬에 대해 보유하지 않는 것 같습니다.SharedArrayBuffer의 배열은 항상 0으로 채워집니다.
데이터가 이미있는 버퍼를 나타내는 배열을 원합니다. 나의 유스 케이스는 이미 데이터가있는 공유 배열 버퍼를받는 웹 작업자이다. 그러나 버퍼를 나타내는 뷰를 만드는 데 성공하지 못했습니다. fillIntBuffer()
function testIntBuffer(n) {
return new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * n);
}
function fillIntBuffer(buffer, endInt) {
for (var i = 0; i <= endInt; i++) {
buffer[i] = i;
}
return buffer;
}
var a = testIntBuffer(10);
var b = new Int32Array(a);
fillIntBuffer(b, 10);
console.log(b);
//inside main.js
function fakeDataArray(n) {
const arr = [];
for(let i = 0; i <= n; i++) {
arr[i] = Math.floor(Math.random() * 100);
}
return arr;
}
function normalArrayToSBA(rawData) {
const n = rawData.length;
const m = Int32Array.BYTES_PER_ELEMENT;
const data = new SharedArrayBuffer(m * n);
rawData.forEach((datum, i) => {
data[i] = datum;
});
return [data, n, m];
}
function createWorker() {
const w = new Worker('workerBundle.js');
w.onmessage = (event) => {
const command = event.data.command;
if (command === 'workerFinish') {
console.log('event recieved from worker: ', event);
}
if (!command) {
return;
}
};
return w;
}
function startworker(dataInfo, options) {
const worker = createWorker();
function setWorkerData(dataInfo) {
const priceBuffer = dataInfo[0];
const size = dataInfo[1];
const offset = dataInfo[2];
worker.postMessage({
command: 'setData',
priceBuffer: priceBuffer,
size: size,
offset: offset
});
}
function getWorkerStats(_options) {
worker.postMessage({
command: 'getStats',
options: _options,
});
}
const id = Math.random();
setWorkerData(dataInfo);
getWorkerStats(options);
}
let data = fakeDataArray(5751);
let dataInfo = normalArrayToSBA(data);
startworker(dataInfo);
//inside workerBundle.js
//eslint-disable-next-line no-unused-vars
const WorkerMessageInterface = {
file: null,
priceData: null,
role: 'worker',
id: null,
pendingRequests: {},
setRole(event) {
WorkerMessageInterface.role = event.data.role;
WorkerMessageInterface.id = event.data.id;
self.postMessage({
success: true,
commandGiven: event.data.command
});
},
//command: 'setFile'
/*{ command: 'setFile', fileInfo: String }*/
setFile(event) {
WorkerMessageInterface.file = event.data.file;
self.postMessage({
success: true,
commandGiven: event.data.command
});
},
//command: 'setData'
/**
* @param {priceData} Array
* @param {source} String - Indicates what utility mapping is necesarry
* to convert data into the highcharts format
*/
setData(event) {
const data = event.data;
const priceBuffer = new Int32Array(data.priceBuffer);
WorkerMessageInterface.priceData = [priceBuffer, data.size];
},
//command: 'getSignals'
/**
* @param {options} Object
*/
getAverage(dataArray) {
let sum = 0;
let length = dataArray.length;
dataArray.forEach((n) => {
sum += n;
});
return sum/length;
},
getStats(event) {
const ops = event.data.options;
const id = WorkerMessageInterface.id;
const data = WorkerMessageInterface.priceData;
const stats = WorkerMessageInterface.getAverage(data);
if (WorkerMessageInterface.role === 'worker') {
self.postMessage({
results: stats,
command: 'workerFinish',
id: id
});
}
},
listenForCommands() {
self.onmessage = (event) => {
const command = event.data.command;
WorkerMessageInterface[command](event);
self.postMessage({
worker: true,
commandGiven: command,
status: 'recieved',
});
};
}
};
WorkerMessageInterface.listenForCommands();
미안 해요 내 질문에 명확하지 않은 경우, 나는 이미 데이터가있는 버퍼를 나타내는 배열을 원한다. 나의 유스 케이스는 이미 데이터가있는 공유 배열 버퍼를받는 웹 작업자이다. 그러나 버퍼를 나타내는 뷰를 만드는 데 성공하지 못했습니다. –
"이미 데이터가 있습니다"라는 의미는 무엇입니까? 데이터는 Question의 패턴에 따라 Answer에서 'Int32Array'내에 설정됩니다. 'ArrayBuffer'를'Worker'에 어떻게 전달합니까? 질문에 실제 코드 및 유스 케이스 설명을 포함시킬 수 있습니까? https://stackoverflow.com/help/how-to-ask, https://stackoverflow.com/help/mcve를 참조하십시오. – guest271314
물론 실제 코드를 보여줄 수는 있지만 질문의 핵심은 복잡합니다. 먼저 길이가 설정된 버퍼를 만들고 fillIntBuffer를 사용하여 버퍼를 채운 다음 해당 버퍼에서 뷰를 생성하려고합니다. (이미 데이터가 있음)에 Int32Array를 사용합니다. 게시 메시지를 통해 웹 작업자에게 버퍼를 보냅니다. 그래도 명확하지 않으면 코드 자체를 게시하게되어 기쁩니다. –