A volte è necessario eseguire processi in background e, non appena uno di essi termina, eseguire alcune azioni in base al suo codice di uscita. Dalla v19 R4, 4D consente di avviare un processo in background con la nuova classe 4D.SystemWorker e di eseguire automaticamente i metodi di callback quando il processo restituisce informazioni. In questo modo, l’interfaccia utente dell’applicazione rimane reattiva durante l’esecuzione del processo esterno e, al termine, è possibile visualizzare subito il risultato all’utente!
Un SystemWorker è un oggetto creato con il costruttore 4D.SystemWorker.new(processo). Crea un nuovo worker che avvia il processo passato come parametro e ne attende la fine.
Ecco alcuni esempi di come eseguire vari comandi di git usando un SystemWorker.
Cominciamo in modo semplice e immaginiamo di dover recuperare la versione di git installata sul computer. Si hanno due modi per farlo:
- Se si vuole farlo in modo asincrono, per lasciare che il client continui a usare liberamente l’interfaccia, basta usare una call back che verrà richiamata alla fine del processo:
$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)
- Se si preferisce attendere la risposta del processo, basta usare .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)
Continuiamo con un commit che attende un messaggio di commit. In questo esempio, il processo attende l’input standard. Se ci si trova in una console, significa che la console attende che l’utente inserisca un valore:
In questi casi, si può usare la funzione .postMessage() per inviare il messaggio e la funzione .closeInput() per indicare al processo che il messaggio è stato inviato:
$param:=New object
$param.currentDirectory:=$myProjectDirectory
$sys:=4D.SystemWorker.new("git commit -F -";$param)
$sys.postMessage("This is my first commit")
$sys.closeInput()
Come si può notare, il system worker va oltre il comando Launch external process e consente di avviare i processi in modo asincrono. Permette di avviare processi in modo asincrono e di ricevere facilmente l’outputStream e l’errorStream dal processo chiamato. Inoltre, è possibile utilizzare un nuovo modo per comunicare con il processo attraverso la funzione postMessage().
Non dimenticate di testare questa funzione con l’HDI di cui sopra e di imparare a usarla per avviare diversi processi in parallelo.
Consultate il centro per gli sviluppatori per maggiori dettagli!