Multithreading en JavaScript

Imitación Multithreading en JavaScript

Un evento dinámico impulsado por la arquitectura es como el perro pidiendo (si se pudiera), "¿Cuándo va a lanzar la bola, cuando, ¿eh, ¿cuándo?" El pseudo-arquitectura de subprocesos se implementa utilizando los tiempos de espera. El pseudo-hilo es el resultado de una función periódica o llame al objeto, y la aplicación completa se muestra en el siguiente código fuente.

 Fuente: / cliente / scripts / Jaxson / Common.js función ThreadObject () (this.obj = null; this.data = null; this.intervalId = null; this.isUsed = false;) ThreadObject.prototype.makeCall = function () ( if (typeof (this.obj) == "function") (this.obj (this.data);) else if (typeof (this.obj) == "object") (this.obj.run (this.data );)) = (var Thread threadObjects: new Array (), StartThread: function (obj, datos, tiempo) (for (var c1 = 0; c1 <this.threadObjects.length; c1 + +) (if (! este . threadObjects [C1]. isUsed) (this.threadObjects [C1]. isUsed = true; this.threadObjects [C1]. data = datos; this.threadObjects [C1]. obj = obj; this.threadObjects [C1]. intervalId = window.setInterval ( "Thread.threadObjects [" + C1 + "]. makeCall ()", tiempo); this.threadObjects retorno [C1]. intervalId;)) throw new error ( "No se puede iniciar un hilo"); ), endThread: function (intervalId) (for (var c1 = 0; c1 <this.threadObjects.length; c1 + +) (if (this.threadObjects [C1]. intervalId == intervalId) (window.clearInterval (intervalId) ; this.threadObjects [C1]. isUsed = false;)))) InitializeThreads función (MaxThreads) (for (var c1 = 0; c1 <MaxThreads; c1 + +) (Thread.threadObjects.push (ThreadObject nuevo ()); )) InitializeThreads (30);

En la fuente, dos tipos de objetos se definen: ThreadObject e hilo. El tipo de ThreadObject se utiliza para gestionar el hilo simulacros e hilo maneja los hilos de burla. La función InitializeThreads se utiliza para establecer la pseudo-Threading medio ambiente. Para explicar este código fuente, un enfoque de arriba abajo se utiliza.

Cuando se carga el archivo JavaScript que contiene el pseudo-arquitectura de subprocesos, la función de InitializeThreads se llama con un valor de parámetro de 30. InitializeThreads se utiliza para inicializar la matriz de pseudo-temas a los que serán llamados. Codificación dura un máximo de 30 temas de discusión puede parecer una mala práctica de programación, pero hay una razón para ello. Para crear un pseudo-hilo, se crea un evento periódico, que significa que debe utilizar el window.setInterval o método window.setTimeout. Llamar a cualquiera de estos métodos requiere una referencia de función o un trozo de código JavaScript. El problema con los dos enfoques es que se necesita para serializar el código fuente. Por ejemplo, imagine que usted desea llamar a cualquiera de los métodos de eventos periódicos con un local inst objeto de referencia, como se ilustra en el siguiente código:

window.setInterval ( "CallFunction (INST)", 300);
  

La referencia a la inst en el búfer de cadena no tendrá sentido, porque cuando el temporizador periódico se ejecuta, las variables locales no están en su contexto. La ejecución se traducirá en un error. Otra forma de llamar a la función de serializar inst a un buffer, sino que tiene la desventaja de que el Estado está utilizando en el caso de periódicos no será la misma instancia de objeto, por tanto, si los cambios se hacen entre la convocatoria de la función setInterval y expiración del temporizador, que no estarán presentes. El único momento en inst es válida si es INST es una variable global. Como regla general, la forma más segura de hacer un contexto método específico de llamada con el setInterval métodos o setTimeout es utilizar una referencia mundial. Una referencia mundial se puede crear dinámicamente instancias de variables aleatorias o mediante una referencia del índice de matriz. El enfoque elegido por el hilo es el índice de la matriz. La función InitializeThreads inicializará 30 referencias mundiales de ThreadObject. Cada ThreadObject tiene cuatro miembros de datos:

• obj: hace referencia al objeto de ejecutar. El método ThreadObject.makeCall puede distinguir entre una función y objeto. Si obj es una función, a continuación, obj será llamado usando una notación de función. Si obj es una instancia de objeto, el método se llama obj.run.

• datos: Referencias de los datos utilizados en un contexto cuando se ejecuta obj.

• intervalId: Hace referencia al valor devuelto por el método window.setInterval. Este valor se utiliza para detener el evento periódico.

• isUsed: Usado por hilo para determinar si un índice de matriz se utiliza actualmente. Cuando un nuevo hilo quiere empezar, las búsquedas StartThread método para un índice de vacío, donde isUsed equivale a un valor de falso. Una vez que el hilo se ha iniciado, el miembro de datos isUsed se le asigna un valor de verdad. Y cuando el hilo ha terminado de ejecutarse, el miembro de datos isUsed se le asigna un valor false de nuevo. El pseudo-arquitectura de subprocesos se utiliza en la declaración de DynamicIterator referencia en la navegación onmouseover de metadatos y eventos onmouseout. Al mover el ratón de una región de la página HTML a otro, y la otra región tiene el evento onmouseover en práctica, se desencadena el evento. El evento onmouseover se activa sólo la primera vez que se mueve el ratón sobre el evento, y que hace que el método startIteration a ser llamado, Thread.startThread llamada. Cuando el ratón se mueve fuera de la región de navegación de metadatos, el método de StopIteration se llama, llamando Thread.endThread. La aplicación de startIteration y StopIteration se define como sigue.

 Fuente: / cliente / scripts / Jaxson / uimorphing.js (DynamicIterator)intervalId: 0, startIteration: function (dirección) (this.intervalId = Thread.startThread (function (Directiva) (DynamicIterator.shiftArrayElements (Dirección);), dirección, 500);), StopIteration: function () (Thread.endThread ( this.intervalId);),

Poner las piezas restantes del cliente junto

Varias veces he DynamicIterator referencia a la aplicación, que se utiliza para navegar por los metadatos del conjunto de resultados. La función principal de DynamicIterator es cargar los elementos de metadatos de navegación, y cuando los elementos individuales se hace referencia, los principales datos que se cargue. Explico la aplicación de DynamicIterator en trozos, con la siguiente representación de la inicialización de los elementos de navegación.

 Fuente: / cliente / scripts / Jaxson / uimorphing.js var DynamicIterator = (lastElem: null, floatingIframe: null, parentRow: null, initialize: function (floatingIframeID, parentRowID) (this.floatingIframe = document.getElementById (floatingIframeID); this.parentRow = document.getElementById (parentRowID); this.doLayout (); this.getMoreRootElements (0);), doLayout: function () (this.floatingIframe.style.width = document.body.clientWidth - 4; this.floatingIframe.style. = altura document.body.clientHeight - 104;), / / Otras declaraciones ...);

 

Volviendo al inicio de la "Implementación del cliente de HTML sección", recuerda el trozo de código HTML que implementó el evento body.onload, que llama a la función Iniciar locales. En la aplicación de inicializar, se llama al método DynamicIterator.initialize. Llamadas DynamicIterator.initialize será referencias cruzadas de los elementos de una interfaz de usuario HTML con la instancia de DynamicIterator.

DynamicIterator.initialize espera dos elementos de la interfaz de usuario HTML: el iframe flotante (this.floatingIframe) y la fila de la tabla (this.parentRow) que contiene los elementos de navegación. DynamicIterator las necesidades de estos dos elementos de la interfaz de usuario, ya que carga los datos de relieve en el área de navegación. Después de los elementos de interfaz de usuario se han asignado a los miembros de datos, se llama al método doLayout. El propósito de doLayout es cambiar el tamaño del iframe para que cubra el área de cliente adecuado. Y la llamada al método DynamicIterator.initialize último es el llamado del método getMoreRootElements, que es responsable de cargar los elementos de metadatos para la navegación. En el contexto de DynamicIterator, el método getMoreRootElements se declara como una función vacía similar al siguiente:

getMoreRootElements: function (dirección) ()

La función de vacío es un marcador de posición, y se espera que el código HTML se declare una aplicación. En el caso del código HTML, getMoreRootElements se define como sigue.

 Fuente: / cliente / artículos ajaxrest / Arquitectura / DynamicIterator.getMoreRootElements dynamiclist.html = function (dirección) (if (sentido == 0) (var = asincrónica FactoryHttp.getCachedAsynchronous (); asynchronous.settings = (onComplete: function (xmlhttp) (var arrTickers = new Array (); tickers var = JSON.parse (xmlhttp.responseText); for (var c1 = 0; c1 <tickers.length; c1 + +) (arrTickers.push ((text: tickers [C1], URL : "/ pyservices / operador / Histórico / teletipos /" + tickers [C1]));) DynamicIterator.associateElements (arrTickers);)) asynchronous.get ( "/ pyservices / operador / Histórico / Plug-ins");))

En el caso del código HTML, los tickers que representan los metadatos utilizados para navegar a través de la aplicación se cargan una sola vez. Los metadatos pueden ser ilimitado, pero a menudo puede ser limitada a un tamaño conjunto fijo, aunque establece que el tamaño es muy grande. Mirando el ejemplo, cada uno de los metadatos es un ticker que pueden tener de uno a cuatro letras (en promedio). Si se multiplica ese número por 1.000 tickers, entonces usted tiene que descargar sobre 4KB-5 KB de datos (en esta era de la banda ancha , la descarga de 4KB-5KB es trivial). La aplicación de valores permitirá a la mayoría de los 50 tickers debido a limitaciones técnicas, de modo que todos los teletipos se pueden descargar en una solicitud.

En el caso de nuestro ejemplo, getMoreRootElements con una dirección de 0 significa para descargar un conjunto inicial de elementos de metadatos. ¿Cómo que se descarga de datos es responsabilidad de la aplicación getMoreRootElements. En este ejemplo se utiliza la clase asíncrona, y la respuesta se codifica como una matriz JSON. Por cada ticker encontrados, se crea un objeto donde el símbolo se combina con una dirección URL y se añade a la matriz arrTickers. ArrTickers Una vez que la matriz ha estado llena de elementos, el DynamicIterator. AssociateElements método se denomina de la siguiente manera.

 Fuente: / cliente / scripts / Jaxson / uimorphing.js (DynamicIterator)associateElements: function (arrElements) (this.arrElements = arrElements; this.shiftArrayElements (0);),

El método associateElements hace dos cosas: asigna la matriz de referencia arrElements y actualiza los datos en la página HTML utilizando el método de shiftArrayElements. Si el usuario pasa el ratón sobre la flecha de la izquierda o la derecha, la lista de cotizaciones de los cambios hacia la izquierda o la derecha.

La variación del índice se encuentra dentro del método shiftArrayElements. El llamador del método proporciona la dirección del desplazamiento con un valor positivo o negativo. Basado en el valor de dirección, el índice se cambió. Si el índice pasó va más allá de los límites de la matriz, a continuación, más elementos de metadatos deben ser recuperados. La plena aplicación de shiftArrayElements es la siguiente.

 Fuente: / cliente / scripts / Jaxson / uimorphing.js (DynamicIterator)shiftArrayElements: function (offset) (this.currOffset = this.currOffset + offset; si (this.currOffset <0) (this.getMoreRootElements (-1); this.currOffset = 0;) else if ((this.currOffset + este . parentRow.cells.length)> = this.arrElements.length) (this.getMoreRootElements (1); this.currOffset = this.arrElements.length - this.parentRow.cells.length;) for (var counter = 1; lucha contra <(this.parentRow.cells.length - 1); contador + +) (this.parentRow.cells [contador]. innerHTML = this.arrElements [this.currOffset + contador - 1]. texto; this.parentRow.cells [ contador]. refElemInfo = this.arrElements [this.currOffset + contador - 1];)),

En la aplicación de shiftArrayElements, un cálculo del cambio exige una prueba para determinar si el cambio va a causar un salto más allá de los límites de la matriz. Si un salto a la izquierda oa la derecha de los límites de matriz ocurre, entonces el método getMoreRootElements se llama, donde el valor de dirección -1 o 1, se especifica el prefijo de metadatos para el comienzo de la matriz o añadir datos al final de la matriz, respectivamente. Si el cambio no causar un salto más allá de los límites de la matriz, a continuación, los distintos elementos HTML de usuario se vuelve a dibujar con la información de referencia nuevo adjunto a la propiedad refElemInfo. No es habitual para fijar sus propios datos a un individuo elemento de interfaz de usuario HTML, pero en este caso, es absolutamente necesario por motivos que ver con un usuario asomar el ratón sobre el elemento.

Si el usuario pasa el ratón sobre un teletipo, desea que la información de teletipo que se cargará en la ventana iframe flotante. Esto se logra mediante el método de DynamicIterator.HightlightItem, que se define como sigue.

 Fuente: / cliente / scripts / Jaxson / uimorphing.js (DynamicIterator)highlightItem: function (elem) (if (this.lastElem! = null) (this.shrinkElement (this.lastElem);) this.expandElement (elem); this.lastElem = elem; this.fetch (elem.refElemInfo);) ,

highlightItem no hace más que delegar las acciones a la shrinkElement, expandElement, y buscar métodos. Todos estos métodos son por defecto funciones de vacío que la página HTML que debe aplicar. La idea de highlightItem es proporcionar un esquema de navegación clickless. ¿Cómo hacer la función de navegación es responsabilidad de la página HTML. DynamicIterator responsabilidad es la coordinación. Por lo tanto, el primer paso es cambiar el tamaño de volver a la normalidad el último elemento que se destacó por el método shrinkElement. En el caso del ejemplo de cotización, se aplica de la siguiente manera.

 Fuente: / cliente / artículos ajaxrest / Arquitectura / dynamiclist.html DynamicIterator.shrinkElement = function (elem) (elem.style.fontSize = 12;)

La aplicación es simple de cotización en que se contrae la fuente de la celda de la tabla de nuevo a 12. Para amore sofisticada interfaz de usuario, reduciendo el elemento podría haber significado el cierre de un menú o un pop-up elemento div. El siguiente paso de highlightItem es poner de relieve el elemento actual con la función expandElement, que se realiza de la siguiente manera.

 Fuente: / cliente / artículos ajaxrest / Arquitectura / dynamiclist.html DynamicIterator.expandElement = function (elem) (elem.style.fontSize = 30; var = asincrónica FactoryHttp.getCachedAsynchronous (); asynchronous.settings = (onComplete: function (xmlhttp) () ) asynchronous.get (elem.refElemInfo.url);)

La aplicación expandElement hace dos cosas: aumenta el tamaño de la fuente y descarga de los datos asociados con el elemento de metadatos. Sin embargo, en la aplicación de onComplete, no hay acción, porque cuando se resalte el elemento de metadatos, que probablemente no estén interesados en mostrar los datos, pero usted está interesado en caché los datos para futuras referencias rápidas. En este punto, usted necesita tomar una decisión sobre el mecanismo de mostrar los datos en el iframe. Si desea mostrar los datos mediante un clic, a continuación, es necesario implementar OnClick para las celdas individuales. Si desea utilizar el acto de poner de relieve que el gatillo para mostrar los datos, entonces usted necesita para aplicar el método onComplete que acabo de decir, no deben aplicarse. Mi punto es que la forma de mostrar los datos de usted , y DynamicIterator define ningún marco. DynamicIterator sólo es responsable de la precarga de los datos. Algunos lectores pueden pensar que la recuperación de datos cada vez que un elemento de metadatos se pone de relieve es muy caro, pero el costo depende de cómo se implementa su caché. Esto significa que cada vez que se hace referencia a asíncrono, lo primero que hace es comprobar la memoria caché de la información. Si la información está ya disponible, el método onComplete se llama directamente. La magia está en la caché, y si no hay memoria caché, entonces cada vez que el elemento de metadatos se pone de relieve, los datos asociados con el recurso será cargado.

Demos un paso atrás y pensar en la aplicación de la arquitectura cliente-lado y cómo se resuelve nuestro problema de grandes conjuntos de datos o lenta. Si estuviéramos trabajando con una aplicación de correo electrónico, a continuación, los metadatos serían los títulos individuales de correo electrónico, y nos iterar sobre los títulos y ponerlas de manifiesto. Para comprobar el correo, que escindir un hilo que automáticamente agregar elementos de metadatos para la final de la matriz arrElements. Como hemos iterar sobre los títulos de correo electrónico, su contenido habrá de ser descargado y aparece en la ventana iframe. Ahora, digamos que estábamos todos de cálculo de los números primos y querían ver los resultados. En este caso, los metadatos son los datos, y como la aplicación de correo electrónico, un hilo se separó a seguir sumando los resultados a la matriz arrElements. He mencionado estos dos ejemplos de temas que se separó, porque hasta ahora sólo el ejemplo ilustra el la expansión y la carga de datos cuando el usuario lo solicite. Utilizando hilos de ejecución de JavaScript, los datos se carga automáticamente sin necesidad de que el usuario pida.

un artículo presentado por Sonja Lande


Descargo de responsabilidad:Nuestro sitio web no es responsable por el contenido de este artículo. Webarticles es un recurso de información gratuito.
Importante: Este artículo "Multithreading en JavaScript" fue traducida por un software automático. Sentimos pena por los errores de ortografía que pueda haber ocurrido. Gracias por su comprensión.


Online: 280 users browsing the articles directory