2017-10-04 5 views
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(); 

답변

1

패스 SharedArrayBuffernew Int32Array()에 :

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); 
fillIntBuffer(a, 10); 
console.log(a); 

var b = new Int32Array(a); 
console.log(b) 

내 프로젝트의 실제 코드가 (가짜 데이터 기능 제외) 모습입니다

+0

미안 해요 내 질문에 명확하지 않은 경우, 나는 이미 데이터가있는 버퍼를 나타내는 배열을 원한다. 나의 유스 케이스는 이미 데이터가있는 공유 배열 버퍼를받는 웹 작업자이다. 그러나 버퍼를 나타내는 뷰를 만드는 데 성공하지 못했습니다. –

+1

"이미 데이터가 있습니다"라는 의미는 무엇입니까? 데이터는 Question의 패턴에 따라 Answer에서 'Int32Array'내에 설정됩니다. 'ArrayBuffer'를'Worker'에 어떻게 전달합니까? 질문에 실제 코드 및 유스 케이스 설명을 포함시킬 수 있습니까? https://stackoverflow.com/help/how-to-ask, https://stackoverflow.com/help/mcve를 참조하십시오. – guest271314

+0

물론 실제 코드를 보여줄 수는 있지만 질문의 핵심은 복잡합니다. 먼저 길이가 설정된 버퍼를 만들고 fillIntBuffer를 사용하여 버퍼를 채운 다음 해당 버퍼에서 뷰를 생성하려고합니다. (이미 데이터가 있음)에 Int32Array를 사용합니다. 게시 메시지를 통해 웹 작업자에게 버퍼를 보냅니다. 그래도 명확하지 않으면 코드 자체를 게시하게되어 기쁩니다. –

관련 문제