Avviare un processo esterno in modo asincrono

Tradotto automaticamente da Deepl

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!

Lavoratore di sistema HDI

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!

Fabrice Mainguené
- Product Owner -Fabrice Mainguené si è unito al team di 4D Program nel novembre 2016. In qualità di Product Owner, è incaricato di scrivere le storie degli utenti e di tradurle in specifiche funzionali. Il suo ruolo è anche quello di assicurarsi che l'implementazione della funzionalità fornita soddisfi le esigenze del cliente.Dopo aver conseguito una laurea in Informatica presso il CNAM, Fabrice è entrato a far parte di una piccola società di pubblicazione di software come sviluppatore Windev. In seguito ha lavorato per diverse aziende del settore industriale e commerciale come sviluppatore Windev e web e come consulente tecnico su nuove funzionalità.