javascript - validacion - Usando objetos transferibles de un trabajador web
validar nombre javascript (5)
La respuesta dada por sbr funciona, pero causaría una copia de los datos antes de ser enviada al trabajador. Eso podría ser lento para una gran cantidad de datos.
Para usar "objetos transferibles", usted realmente transfiere la propiedad del objeto hacia o desde el trabajador web. Es como pasar por referencia donde no se hace una copia. La diferencia entre esto y el paso por referencia normal es que el lado que transfirió los datos ya no puede acceder a ellos.
Creo que la forma en que deberías enviar los datos en tu ejemplo es:
w.postMessage(r,[r]); // first arg is r, not 0 as in the question
Y de la forma en que accedes a ella en la web del trabajador:
addEventListener(''message'', function(event) {
var r = event.data;
});
En mi propia aplicación, necesitaba enviar un Float64Array de tipo grande desde el trabajador web al hilo principal, sin la penalización de rendimiento de la copia. Tomó muchas pruebas, errores y búsquedas, así que pensé que debería incluir ese ejemplo aquí para cualquier otra persona que se atasque con un problema similar.
Este es el código que funcionó en el lado del trabajador (arr es mi Float64Array):
self.postMessage(arr.buffer, [arr.buffer]);
En el hilo principal de recepción tengo:
theWorker.addEventListener(''message'', function(ev) {
var arr = new Float64Array(ev.data); // just cast it to the desired type - no copy made
// ...
});
Tenga en cuenta que esto funciona en Chrome, pero tal vez no la mayoría de los otros navegadores en esta fecha (no lo he probado todavía).
Además, si desea enviar otra información además de la gran matriz, puede hacer esto:
self.postMessage({foo:"foo", bar:arr.buffer}, [arr.buffer]);
En el hilo receptor (en este ejemplo, el principal):
theWorker.addEventListener(''message'', function(event) {
var foo = event.data.foo;
var arr = new Float64Array(event.data.bar); // cast it to the desired type
// ...
});
Actualmente tengo este código para crear un trabajador web:
w = new Worker("webwork.js");
w.onmessage = function(event) { alert(event.data); }
Y luego el código webwork.js
para el trabajador web:
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);
}
Ahora quiero transferir un ArrayBuffer
128 megabytes con este código:
var r = new ArrayBuffer(1048576*128);
w.postMessage(0, [r]);
Ahora que supuestamente he transferido la variable r
, ¿cómo puedo acceder a ella desde el propio Web Worker? He intentado event.r
, just r
, self.r
y otras cosas como intentar agregar un segundo argumento de función para la matriz de ArrayBuffers
, pero nada funciona.
¿Cómo puedo acceder a las variables transferidas desde el Trabajador Web?
Pruebe w.postMessage ([0, r]). Para usar objetos transferibles, uno necesita pasar el búfer de matriz como el segundo elemento en una matriz. Ver this
Si desea utilizar Web Worker fácilmente, puede probar esta pequeña libreta: WW
Espero eso ayude
esto funciona para mi
//en general
var x = new ArrayBuffer(1048576*128);
w.postMessage({buffer: x});
// En el hilo de trabajo, en el controlador de mensajes,
processMessage: function(ev){
var buffer = ev.data.buffer,
// other stuff . buffer is referenced correctly here.
}
PostMesage(aMessage, transferList)
En transferList
debe especificar los objetos transferibles, que figuran en aMessage
:
var objData =
{
str: "string",
ab: new ArrayBuffer(100),
i8: new Int8Array(200)
};
objWorker.postMessage(objData, [objData.ab, objData.i8.buffer]);
Del otro lado:
self.onmessage = function(objEvent)
{
var strText = objEvent.data.str;
var objTypedArray = objEvent.data.ab;
var objTypedArrayView = objEvent.data.i8;
}