Este es el sitio web histórico de la documentación de 4D. La documentación se está trasladando progresivamente a developer.4d.com |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v20.6
Procesos 4D apropiativos
|
Ejecución apropiativa | |
4D Server | X |
4D remoto | X (con ServerNet únicamente - ver Nueva capa de red ServerNet (compatibilidad)) |
4D mono usuario | X |
Modo compilado | X |
Modo interpretado | - |
Si el contexto de ejecución soporta el modo apropiativo y si el método es "hilo de seguro", un proceso 4D lanzado utilizando los comandos New process o CALL WORKER, o vía el comando de menú "Ejecutar método" se ejecutará en modo apropiativo.
De lo contrario, si llama New process o CALL WORKER desde un contexto de ejecución que no es soportado (desde modo interpretado), el proceso es siempre cooperativo.El código 4D se puede ejecutar en hilo apropiativo sólo cuando se cumplen algunas condiciones específicas. Cada parte del código ejecutado (comandos, métodos, variables...) debe ser compatible con una ejecución apropiativa. Los elementos que se pueden ejecutar en hilos apropiativos se llaman hilos seguros y los elementos que no se pueden ejecutar en hilos apropiativos se llaman hilos inseguros.
Nota: dado que un hilo se maneja de forma independiente a partir del método proceso padre, toda la cadena de llamadas no debe incluir ningún código hilo inseguro, de lo contrario la ejecución apropiativa no será posible. Este punto se discute en el párrafo ¿Cuando un proceso se inicia apropiativamente?.
La propiedad "seguridad de hilo" de cada elemento depende del elemento en sí:
Básicamente, el código que se ejecuta en hilos apropiativos no puede llamar a las partes con las interacciones externas, tal como el código plug-in o las variables interproceso. Los accesos a los datos, sin embargo, son permitidos desde el servidor de datos 4D que soporta la ejecución apropiativa.
Por defecto, 4D ejecuta todos los métodos de proyecto de su aplicación en modo cooperativo. Si desea beneficiarse de la funcionalidad modo apropiativo, el primer paso consiste en declarar explícitamente todos los métodos que desea que se inicien en modo apropiativo siempre que sea posible, es decir, los métodos que considere capaz de ejecutar en proceso apropiativo. El compilador comprobará que estos métodos sean en realidad hilo seguro (ver Escribir un método hilo seguro para más información). También puede inhabilitar el modo apropiativo para algunos métodos, si es necesario.
Tenga en cuenta que la definir un método como apropiativo hace que sea elegible para ejecución apropiativa, pero no garantiza que se ejecute realmente en modo apropiativo. Iniciar un proceso en modo apropiativo resulta de una evaluación realizada por 4D respecto a las propiedades de todos los métodos en la cadena de llamadas del proceso (para más información, consulte el párrafo ¿Cuando un proceso se inicia apropiativamente?.
Para declarar su método de elegibilidad para el modo apropiativo, es necesario utilizar la opción de declaración Modo de ejecución en el cuadro de diálogo Propiedades del método:
Están disponibles las siguientes opciones:
Al exportar el código del método utilizando, por ejemplo METHOD GET CODE, la propiedad "apropiativa" se exporta en el comentario atributo con valor "auto", "seguro", o "inseguro". Los comandos METHOD GET ATTRIBUTES y METHOD SET ATTRIBUTES también obtienen o establecen el atributo "apropiativo" con valor "auto", "seguro", o "inseguro".
La siguiente tabla resume los efectos de las opciones de declaración del modo apropiativo:
Opción | Valor de la propiedad apropiativa (interpretado) | Acción compilador | Etiqueta interna (compilada) | Modo de ejecución, si la cadena de llamadas es hilo seguro |
Se puede ejecutar en procesos apropiativos | capaz | Comprobar la capacidad y devuelve errores si fuera incapaz | Hilo seguro | Apropiativo |
No se puede ejecutar en los procesos apropiativos | incapaz | Sin evaluación | Hilo inseguro | Cooperativo |
Indiferente | indiferente | Evaluación, pero no hay errores devueltos | hilo de seguridad o hilo inseguro | Si hilo seguro: apropiativo; Si hilo inseguro: cooperativo; si es llamado directamente: cooperativo |
Recordatorio: la ejecución apropiativa solo está disponible en modo compilado.
En modo compilado, cuando se inicia un proceso creado por los métodos New process o CALL WORKER, 4D lee la propiedad apropiativa del método proceso (también llamado método padre) y ejecuta el proceso en modo apropiativo o cooperativo, en función de esta propiedad:
La propiedad seguridad de hilo depende de la cadena de llamadas. Si un método con la propiedad declarada "capaz" llama a un método hilo inseguro en cualquiera de sus subniveles, se devolverá un error de compilación: si un método único en toda la cadena de llamadas es hilo inseguro, "contaminará" todos los otros métodos y la ejecución apropiativa será rechazada por el compilador. Un hilo apropiativo solo puede crearse cuando toda la cadena es hilo seguro y el método de proceso ha sido declarado "Se puede ejecutar en proceso apropiativo".
Por otra parte, un mismo método hilo seguro puede ejecutarse en un hilo apropiativo en una cadena de llamada y en hilo cooperativo en otra cadena de llamada.
Por ejemplo, considere los siguientes métodos de proyecto:
//Método proyecto MyDialog
//contiene llamadas de interfaz: será hilo no seguro internamente
$win:=Open window("tools";Palette form window)
DIALOG("tools")
//Método proyecto MyComp
//contiene calculo simple: será hilo seguro internamente
C_LONGINT($1)
$0:=$1*2
//Método proyecto CallDial
C_TEXT($vName)
MyDialog
//Método proyecto CallComp
C_LONGINT($vAge)
MyCom($vAge)
La ejecución de un método en el modo apropiativo dependerá de que la propiedad "ejecución" y de la cadena de llamadas. La siguiente tabla ilustra estas diversas situaciones:
Declaración y cadena de llamadas | Compilación | Seguridad de hilo resultante | Ejecución | Comentario |
![]() | OK | ![]() | Apropiativo | CallComp es el método padre, declarado "capaz" de uso apropiativo; ya que MyComp es internamente hilo seguro, CallComp es hilo seguro y el proceso es apropiativo |
![]() | Error | ![]() | La ejecución es imposible | CallDial es el método padre, declarado "capaz"; MyDialog es "indiferente". Sin embargo, ya que MyDialog está internamente hilo inseguro, contamina la cadena de llamadas. La compilación falla debido a un conflicto entre la declaración deCallDial y su capacidad real. La solución es o bien modificar MyDialog para que sea hilo seguro, de modo que la ejecución es apropiativa, o cambiar la declaración de propiedad de CallDial para correrlo como cooperativo. |
![]() | OK | ![]() | Cooperativo | Como CallDial se declara "incapaz" de uso apropiativo, la compilación es internamente hilo inseguro, la ejecución siempre será cooperativa, cualquiera que sea el estado de MyDialog. |
![]() | OK | ![]() | Cooperativo | Como CallComp es el método padre (la propiedad era "indiferente"), luego el proceso es cooperativo incluso si toda la cadena es hilo seguro. |
![]() | OK | ![]() | Cooperativo | Como CallDial es el método padre (propiedad era "indiferente"), entonces el proceso es cooperativo y la compilación exitosa. |
4D le permite identificar la ejecución de procesos en modo compilado:
Tipo de proceso | Icono |
Proceso almacenado apropiativo | ![]() |
Proceso worker apropiativo | ![]() |
Método web apropiativo | ![]() |
Método SOAP apropiativo | ![]() |
Para ser hilo seguro, un método debe respetar las siguientes reglas:
Notas:
(*) Para intercambiar datos entre procesos apropiativos (y entre todos los procesos), puede pasar colecciones compartidas u objetos compartidos como parámetros a procesos, y/o usar el catálogo Storage. Para obtener más información, consulte la página Objetos y colecciones compartidos.
Los procesos worker también le permiten intercambiar mensajes entre procesos, incluidos los procesos apropiativos. Para más información, consulte el Sobre workers.
(**) El comando ClientComment ofrece una solución elegante para llamar a objetos de interfaz de un proceso apropiativo.
Los métodos con la propiedad "Se puede ejecutar en procesos apropiativos" serán verificados por 4D en el paso de compilación. Un error de compilación se emite cuando el compilador encuentra algo que le impide ser hilo seguro:
Nota: es posible deshabilitar localmente la verificación hilo seguro Desactivar localmente la verificación hilo de seguridad ver abajo)
El archivo de símbolos, si está habilitado, también contiene el estado de hilo de seguridad para cada método:
Ya que son accesos "externos", las llamadas a objetos de interfaz de usuario, tales como formularios, así como también al Depurador no están permitidas en hilos apropiativos.
Los únicos accesos posibles a la interfaz de usuario de un hilo apropiativo son:
Un número significativo de comandos 4D son hilo seguro. En la documentación, la imagen en el área de propiedad del comando indica que el comando es hilo seguro. Puede obtener la lista de comandos hilo seguro en el manual Referencia del lenguaje.
También puede utilizar Command name que puede devolver la propiedad hilo seguro para cada comando (ver abajo).
Cuando un método utiliza un comando que puede llamar un disparador, el compilador 4D evalúa la seguridad de hilo del disparador para comprobar la seguridad de hilo del método:
SAVE RECORD([Table_1]) //dispara en Table_1, si existe, debe ser hilo seguro
Esta es la lista de comandos que se verifican en el momento de la compilación para la seguridad de hilo de los disparadores:
Si la tabla se pasa dinamicamente, el compilador puede algunas veces no encontrar que trigger evaluar. Estos son algunos ejemplos de cada situación:
DEFAULT TABLE([Table_1])
SAVE RECORD
SAVE RECORD($ptrOnTable->)
SAVE RECORD(Table(myMethodThatReturnsATableNumber())->)
En este caso, todos los triggers son seleccionados.Si se detecta un comando hilo inseguro en al menos un trigger, todo el grupo se rechaza y el método se declara hilo inseguro.
Los métodos de captura de errores instalados por el comando ON ERR CALL deben ser hilo seguro si es probable que sean llamados desde un proceso apropiativo. Con el fin de manejar este caso, el compilador verifica la propiedad de seguridad de hilo de los métodos de proyecto de captura de errores pasados al comando ON ERR CALL durante la compilación y devuelve los errores correspondientes si no cumplen con la ejecución apropiativa..
Tenga en cuenta que esta comprobación sólo es posible cuando el nombre del método se pasa como una constante, y no se calcula, como se muestra a continuación:
ON ERR CALL("myErrMethod1") //será verificado por el compilador
ON ERR CALL("myErrMethod"+String($vNum)) //no será verificado por el compilador
Además, a partir de 4D v15 R5, si un método de proyecto de captura de errores no se puede llamar en tiempo de ejecución (luego de un problema de seguridad hilo, o por cualquier razón como "método no encontrado"), se genera el nuevo error -10532 "No se puede llamar al método de proyecto de gestión de errores 'methodName'".
Un proceso puede desreferenciar a un puntero para acceder al valor de otra variable proceso sólo si ambos procesos son cooperativos, de lo contrario 4D generará un error. En un proceso apropiativo, si algún código 4D intenta desreferenciar un puntero a una variable interproceso, 4D generará un error.
Ejemplo con los siguientes métodos:
Method1:
myVar:=42
$pid:=New process("Method2";0;"process name";->myVar)
Method2:
$value:=$1->
Si el proceso que ejecuta Method1 o el proceso que ejecuta Method2 es apropiativo, luego la expresión "$value:=$1->" lanzará un error de ejecución.
El uso de parámetros de tipo DocRef (referencia de documento abierto, utilizado o devuelto por los comandos Open document, Create document, Append document, CLOSE DOCUMENT, RECEIVE PACKET, SEND PACKET) se limita a los siguientes contextos:
Para más información sobre la referencia DocRef, consulte la sección DocRef: número de referencia del documento.
En algunos casos, puede que prefiera que la verificación "thread-safety" de los comandos no se aplique a algunas partes del código, como por ejemplo, cuando tiene comandos no hilo seguro que sabe que nunca se van a llamar.
Para hacer esto, debe rodear el código a excluir del comando hilo seguro utilizando las directivas específicas %T- y %T+ como comentarios. El comentario //%T- desactiva la verificación hilo seguro y el comentario //%T+ la reactiva:
// %T- para deshabilitar la verificación hilo seguro
// Coloque el código que contiene los comandos que se excluirán de la verificacion hilo seguro
$w:=Open window(10;10;100;100) //por ejemplo
// %T+ para reactivar nuevamente la verificación hilo seguro para el resto del método
Por supuesto, el desarrollador 4D es responsable de que el modo apropiativo del código sea compatible con las directivas de activación y de reactivación. Se generarán errores de tiempo de ejecución si se ejecuta código hilo no seguro en un hilo apropiativo.
Producto: 4D
Tema: Procesos
Creado por: 4D v15 R5
Manual de lenguaje 4D ( 4D v20)
Manual de lenguaje 4D ( 4D v20.1)
Manual de lenguaje 4D ( 4D v20.2)
Manual de lenguaje 4D ( 4D v20.3)
Manual de lenguaje 4D ( 4D v20.4)
Manual de lenguaje 4D ( 4D v20.5)
Manual de lenguaje 4D ( 4D v20.6)