4D v16.3Procesos 4D apropiativos |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v16.3
Procesos 4D apropiativos
|
Ejecución apropiativa | |
4D Server | X |
4D remoto | - |
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 (por ejemplo en una máquina 4D remota), el proceso es siempre cooperativo.Nota: puede ejecutar un proceso en modo apropiativo desde un 4D remoto iniciando un procedimiento almacenado en el servidor con el lenguaje, por ejemplo, con Execute on server.
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:
Nota: un método de componentes declarados como "Compartido con componentes y bases locales" también debe ser declarado "capaz" con el fin de que pueda correr en un hilo apropiativo por la base local.
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 sólo 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 sólo 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 | Comentario | Ejecución |
OK | ![]() | Método A es el método padre, declarado "capaz" de uso apropiativo; ya que el método B es internamente hilo seguro, el método A es hilo seguro y el proceso es apropiativo | Apropiativo | |
![]() | Error | ![]() | El método C es el método padre, declarado "capaz"; sin embargo, ya que el método E está internamente hilo inseguro, contamina la cadena de llamadas. La compilación falla debido a un conflicto entre la declaración del método C y la capacidad real | La solución es o bien modificar el método E para que sea hilo seguro (suponiendo que el método D es hilo seguro), de modo que la ejecución es apropiativa, o para cambiar la declaración de propiedad del método C a cooperativo |
![]() | OK | ![]() | Como el método F se declara "incapaz" de uso apropiativo, la compilación es internamente hilo inseguro, la ejecución siempre será cooperativa, cualquiera que sea el estado del método G | Cooperativo |
![]() | OK | ![]() | Desde que el método H es el método padre (la propiedad era "indiferente") , el proceso es cooperativo. La compilación es exitosa, incluso si el método fue declarado "capaz" | Cooperativo |
![]() | OK | ![]() | el método J es el método padre (propiedad "indiferente"), entonces el proceso es cooperativo, incluso si toda la cadena es hilo seguro | Cooperativo |
4D le permite identificar la ejecución de procesos en modo compilado:
Tipo de proceso | Icono |
Proceso almacenado apropiativo | ![]() |
Proceso worker apropiativo | ![]() |
Proceso worker cooperativo | ![]() |
Para ser hilo seguro, un método debe respetar las siguientes reglas:
Nota: en el caso de un método "Compartido por componentes y bases locales", la propiedad "Se puede ejecutar en procesos apropiativos" debe ser seleccionada.
(*) Los procesos worker, permiten el intercambio de datos entre todos los procesos, incluyendo 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:
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.
Producto: 4D
Tema: Procesos
Creado por: 4D v15 R5
Manual de lenguaje 4D ( 4D v16.1)
Manual de lenguaje 4D ( 4D v16.2)
Manual de lenguaje 4D ( 4D v16.3)