我目前有这个代码来创建一个Web Worker:

w = new Worker("webwork.js");
w.onmessage = function(event) { alert(event.data); }

然后是Web Worker的webwork.js代码:

self.onmessage = function(event) {
    //var ss=r;  //Causes error because of undefined
    var ss="";
    for(var currProp in event) {
        ss+=("event."+currProp+"="+event[currProp]+"\n");
    }
    postMessage(ss);
}

现在我想用这段代码传输一个128兆字节的ArrayBuffer

var r = new ArrayBuffer(1048576*128);
w.postMessage(0, [r]);

既然我已经转移了变量r ,我该如何从Web Worker本身访问它。 我试过event.r ,只是rself.r和其他一些事情,比如试图为ArrayBuffers数组添加第二个函数参数,但没有任何效果。

如何从Web Worker访问传输的变量?

===============>>#1 票数:48

sbr给出的答案有效,但它会在发送给工作人员之前生成数据的副本。 对于大量数据而言,这可能会很慢。
要使用“可转移对象”,您实际上将对象的所有权转移到Web工作者或从Web工作者转移。 这就像通过引用传递没有复制的地方。 它与正常的引用传递之间的区别在于传输数据的一方无法再访问它。

我相信你应该在你的例子中发送数据的方式是:

w.postMessage(r,[r]);  // first arg is r, not 0 as in the question

以及在Web worker中访问它的方式:

addEventListener('message', function(event) {
    var r = event.data;
});

在我自己的应用程序中,我需要从Web worker向主线程发送一个大型的Float64Array,而不会对副本造成性能损失。 它需要大量的试验和错误以及搜索,因此我认为我应该将这个示例包含在其他任何遇到类似问题的人身上。
这是在工作者端工作的代码(arr是我的Float64Array):

self.postMessage(arr.buffer, [arr.buffer]);

在接收主线程上我有:

theWorker.addEventListener('message', function(ev) {
    var arr = new Float64Array(ev.data);  // just cast it to the desired type - no copy made
    // ...
});

请注意,这适用于Chrome,但截至此日期可能不是大多数其他浏览器(尚未尝试过。)

此外,如果除了大型阵列之外还要发送其他信息,可以执行以下操作:

self.postMessage({foo:"foo", bar:arr.buffer}, [arr.buffer]);

在接收(在此示例中为主)线程:

theWorker.addEventListener('message', function(event) {
    var foo = event.data.foo;
    var arr = new Float64Array(event.data.bar);  // cast it to the desired type
    // ...
});

===============>>#2 票数:37 已采纳

PostMesage(aMessage, transferList)

transferList您必须指定包含在aMessage转移对象:

var objData =
{
    str: "string",
    ab: new ArrayBuffer(100),
    i8: new Int8Array(200)
};
objWorker.postMessage(objData, [objData.ab, objData.i8.buffer]);

在另一边:

self.onmessage = function(objEvent)
{
    var strText = objEvent.data.str;
    var objTypedArray = objEvent.data.ab;
    var objTypedArrayView = objEvent.data.i8;
}

===============>>#3 票数:0

尝试w.postMessage([0,r])。 要使用可传输对象,需要将数组缓冲区作为数组中的第二项传递。 看到这个

===============>>#4 票数:0

如果你想轻松使用web worker,你可以试试这个小的lib: WW

希望能帮助到你

===============>>#5 票数:-4

这对我有用:

//在主要

var x = new ArrayBuffer(1048576*128);
w.postMessage({buffer: x});

//在工作线程中,在消息处理程序中,

processMessage: function(ev){
    var buffer = ev.data.buffer,
    // other stuff . buffer is referenced correctly here. 
}

  ask by alt.126 translate from so

未解决问题?本站智能推荐: