Compartir información en un entorno multihilo

Traducido automáticamente de Deepl

4D v16 R6 introduce un nuevo concepto de comunicación entre procesos: ¡variables de objeto y colección compartidas! Son una solución para que pueda evitar el uso de variables interproceso (que no pueden utilizarse en modo multihilo). Gracias a esto, podrá compartir fácilmente la información entre los procesos en modo preventivo.

Ejemplo de base de datos

Nuevo concepto: objetos compartidos / colecciones

En el mundo de la programación informática, cuando se necesita rendimiento, cuanto menos se compartan los datos, más eficiente será. Pero, por supuesto, en la mayoría de los casos los procesos que has creado deben comunicarse entre sí. Ya sea para enviar parámetros, para obtener resultados o simplemente para acceder a alguna información compartida. Esa es la razón por la que se han creado los objetos y las colecciones compartidas. (Recuerda que los objetos y colecciones normales no pueden ser compartidos entre procesos. Cuando se pasan como parámetros, se crea una copia de los objetos).

Los objetos y colecciones compartidos se comportan igual que los normales, salvo que deben ser declarados como «compartidos» durante su instanciación con los siguientes nuevos comandos: Nuevo objeto compartido y Nueva colección compartida. Una vez instanciados, pueden ser utilizados directamente, como cualquier otro, para su lectura. No se necesita ningún semáforo ni nada parecido, simplemente se utilizan los objetos compartidos.

Para escribir o modificar, los objetos compartidos deben estar rodeados por las palabras clave Use y End use. Estas palabras clave establecen semáforos internos, y deben ser empleadas para acceder al contenido de los objetos y colecciones en modo de escritura. El uso de estas palabras clave es realmente fácil, mucho más fácil que los semáforos del lenguaje 4D. ¿Cómo es eso? No puede olvidarse de liberarlas. Use y End use siempre rodean las variables, por lo que no puedes olvidar liberar el bloqueo.

$object:=New shared object
$ps:=New process("mi proceso";0; "miproceso";$objeto) // enviado como referencia
Use ($object)
$object .miAtributo:=10
End use

¿Cómo utilizarlos en otros procesos?

Puede que te preguntes: ¿Cómo puedo utilizar un objeto compartido de otro proceso (de otra forma que no sea enviando un parámetro)? ¿Cómo puedo compartir sin variables interproceso?

Un objeto «supercompartido» lo resuelve. Un nuevo comando, Storage, proporciona acceso a este objeto, para todos los procesos en ejecución.

Este objeto es único en cada máquina. Uno (en modo monousuario), si no, uno por cliente y otro en el servidor. El comando Storage devuelve el objeto compartido para que pueda ser manipulado como cualquier otro objeto compartido, pero sólo puede contener objetos o colecciones compar tidas. (Tenga en cuenta que los componentes pueden contener Storage propios también)

Use (Storage)
Storage .myCollection:=New shared collection
End use

Beneficios

Los objetoscompartidos y las colecciones compartidas tienen muchas ventajas en comparación con las variables interproceso estándar, como por ejemplo

  • no hay necesidad de protección al leer: acceso rápido
  • Las palabras clave Use y End Use evitan los errores de codificación que provocan situaciones de bloqueo
  • como los objetos o colecciones suelen ser jerárquicos (contienen otros objetos o colecciones), al bloquear un objeto se bloquea toda la cadena a la vez, lo que mejora el rendimiento.

Te acostumbrarás rápidamente a los objetos compartidos y a las colecciones y se convertirá en una forma natural de programar 🙂

Roland Lannuzel
- Propietario de Producto y Experto en 4D - Después de estudiar electrónica, Roland se dedicó a la informática industrial como desarrollador y consultor, construyendo soluciones para clientes con una variedad de bases de datos y tecnologías. A finales de los años 80 se enamoró de 4D y lo ha utilizado para escribir aplicaciones de negocio que incluyen sistemas de contabilidad, facturación y correo electrónico.Eventualmente se unió a la compañía en 1997, las valiosas contribuciones de Roland incluyen el diseño de especificaciones, herramientas de prueba, demos, así como la formación y hablar con la comunidad 4D en muchas conferencias. Continúa dando forma activamente al futuro de 4D definiendo nuevas características y herramientas de desarrollo de bases de datos.