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 R7
Método base On Exit
|
Método base On Exit | ||||||||
Este comando no requiere parámetros | ||||||||
El Método base On Exit se llama una vez cuando sale de la base.
Este método se utiliza en los siguientes entornos 4D:
Nota: Método base On Exit NO es invocado por 4D Server. Debe utilizar Método base On Server Shutdown en este contexto.
El Método base On Exit es invocado automáticamente por 4D; a diferencia de los métodos proyecto, no puede llamar este método base por programación. Sin embargo, puede ejecutarlo desde el editor de métodos. Igualmente puede utilizar subrutinas.
Se sale de una base si:
Sin importar cómo se inicie la salida de la base, 4D realiza las siguientes acciones:
Cuando 4D está a punto de salir, el programa:
4D continúa iterando procesos mientras cualquier proceso siga vivo, durante una duración máxima de 13 segundos. Para responder a una acción de abandono, recomendamos establecer una bandera (como una entrada en el objeto Storage) en el Método base On Exit o en su método de abandono personalizado. Podría tener sentido hacer un bucle en ese método (máximo 10 segundos) para dar tiempo a que sus procesos en ejecución respondan y se abandonen a sí mismos correctamente. No es recomendable esperar más de 10 segundos, para evitar que 4D mate el proceso o el sistema operativo mate toda la aplicación.
El Método base On Exit es perfecto para:
Nota: no olvide que el proceso creado por el Método base On Exit es un proceso local/cliente, por lo tanto no puede acceder al archivo de datos. Si el Método base On Exit realiza una consulta o una ordenación, un cliente 4D que está a punto de salir quedará "congelado" y en realidad no saldrá de la aplicación. Si necesita acceder a datos cuando un cliente sale de la aplicación, cree un nuevo proceso global desde el cual el Método base On Exit pueda acceder al archivo de datos. En este caso, asegúrese de que el nuevo proceso termine correctamente antes del final de la ejecución del Método base On Exit (utilizando por ejemplo Storage o un objeto compartido).
Nota: en un entorno cliente/servidor, Método base On Exit se comporta de manera diferente dependiendo de si el usuario sale manualmente (vía el comando de menú Salir o una llamada al comando QUIT 4D) o que 4D Server se cierre, lo que obliga a todos los clientes a salir.
Cuando se sale de 4D Server y se da un tiempo de corte (por ejemplo, 10 minutos), cada cliente conectado muestra un mensaje de advertencia y si el usuario sale durante el período de tiempo determinado, el Método base On Exit se ejecuta normalmente. Sin embargo, en otros casos (por ejemplo, el usuario no responde a tiempo, el servidor solicita salir inmediatamente o el administrador desconecta manualmente al cliente), el Método base On Exit se ejecuta al mismo tiempo que la conexión al servidor se cierra. Como resultado, el código en Método base On Exit no puede iniciar otro proceso local o de servidor y no puede esperar a que se cancelen otros procesos (ni estos procesos pueden seguir accediendo al servidor). Si intenta hacerlo, se genera un error de red (como 10001 o 10002) ya que la conexión al servidor ya está cerrada.
El siguiente ejemplo muestra un caso típico en el que se lanzan uno o más procesos en segundo plano que realizan trabajos regulares, que se ejecutan sin fin, en el Método base On Startup (o en el Método base On Server Startup). Una bandera en el objeto Storage de la aplicación se utiliza para decirles que terminen y para comprobar si han terminado.
Use(Storage)
Storage.global:=New shared object("ExitNow";False)
End use
$p:=New process("Serverjob";0;"Background job#1")
$p1:=New process("Check_Invoices";0;"Background job#2")
// hacer trabajos regulares en segundo plano en el servidor
While(Not(Bool(Storage.global.ExitNow)))
// ejecutar trabajos de contabilidad, calcular datos, etc.
// ...
DELAY PROCESS(Current process;60*60) //dormir un minuto, luego repetir el bucle
End while
Use(Storage.global)
Storage.global.ExitNow:=True //pedir a todos los workers en segundo plano que salgan
End use
$time:=Current time
$finished:=False
While((($time+10)>(Current time+0))&(Not($finished)))  // máximo 10 segundos
$list:=Get process activity(Processes only) // obtener la lista de todos los procesos
$sublist:=$list.processes.query("name='Background job@' and state >=0") //¿Aún hay un trabajo en segundo plano en ejecución?
$finished:=($sublist.length=0)
If($sublist.length>0)
For each($job;$sublist)
RESUME PROCESS($job.number) //asegurarse de que todos los procesos están despiertos
End for each
End if
End while
Producto: 4D
Tema: Métodos base
Número
905252
Creado por:
Manual de lenguaje 4D ( 4D v20 R7)