A veces hay que ejecutar procesos en segundo plano, y en cuanto uno termina, realizar algunas acciones según su código de salida. A partir de la v19 R4, 4D le permite iniciar un proceso en segundo plano con la nueva clase 4D.SystemWorker y ejecutar métodos de callback automáticamente cuando el proceso devuelve información. De esta manera, la interfaz de usuario de su aplicación permanece receptiva durante la ejecución del proceso externo, y cuando termina, puede mostrar el resultado al usuario de inmediato.
Un SystemWorker es un objeto creado mediante el constructor 4D.SystemWorker.new(proceso). Crea un nuevo worker que inicia el proceso pasado en parámetro y espera hasta el final del mismo.
Aquí hay algunos ejemplos de cómo ejecutar varios comandos de git usando un SystemWorker.
Empecemos de forma sencilla e imaginemos que necesitas recuperar la versión de git instalada en tu ordenador. Tienes dos maneras de hacerlo:
- Si quieres hacerlo de forma asíncrona, para dejar que tu cliente siga usando la interfaz libremente, sólo tienes que usar una llamada de retorno que será llamada al final del proceso:
$param:=New object
// Close the process after 2s if not already terminated
$param.timeout:=2
// Callback formula called when the response is totaly received by the systemworker
$param.onResponse:=Formula(ALERT($1.response))
// Start the system worker with the parameter defined above
$sys:=4D.SystemWorker.new("git --version"; $param)
- Si prefieres esperar la respuesta del proceso, sólo tienes que utilizar .wait():
$param:=New object
// Close the process after 2s if not already terminated
$param.timeout:=2
// Start the system worker with the parameter defined above
$sys:=4D.SystemWorker.new("git --version";$param)
// Wait for the end or the process and return the response from Git
ALERT($sys.wait().response)
Continuemos con una confirmación que espera un mensaje de confirmación. En este ejemplo, el proceso espera la entrada estándar. Si está en una consola, significa que la consola espera a que el usuario introduzca un valor:
En estos casos, puedes utilizar la función .postMessage( ) para enviar tu mensaje y la función .closeInput() para indicar al proceso que el mensaje ha sido enviado:
$param:=New object
$param.currentDirectory:=$myProjectDirectory
$sys:=4D.SystemWorker.new("git commit -F -";$param)
$sys.postMessage("This is my first commit")
$sys.closeInput()
Como puedes notar, el trabajador del sistema va más allá del Launch external process de los trabajadores del sistema. Te permite iniciar procesos de forma asíncrona y recibir fácilmente el outputStream y el errorStream del proceso llamado. Además, puedes utilizar una nueva forma de comunicarte con tu proceso a través de la función postMessage().
No olvides probar esta función con el IDH anterior y aprender a utilizarla para iniciar varios procesos en paralelo.
Consulta el centro de desarrollo para obtener más detalles.