Lancer un processus externe de manière asynchrone

Traduit automatiquement de Deepl

Parfois, vous devez exécuter des processus en arrière-plan, et dès que l’un d’entre eux se termine, effectuer certaines actions en fonction de son code de sortie. Depuis la v19 R4, 4D vous permet de lancer un processus en arrière-plan avec la nouvelle classe 4D.SystemWorker et d’exécuter automatiquement des méthodes de rappel lorsque le processus renvoie des informations. De cette façon, l’interface utilisateur de votre application reste réactive pendant l’exécution du processus externe, et une fois terminé, vous pouvez afficher le résultat à l’utilisateur immédiatement !

Travailleur de système HDI

Un SystemWorker est un objet créé à l’aide du constructeur 4D.SystemWorker.new(processus). Il crée un nouveau worker qui démarre le processus passé en paramètre et attend la fin de celui-ci.

Voici quelques exemples de la façon d’exécuter diverses commandes git à l’aide d’un SystemWorker.

Commençons simplement et imaginons que vous ayez besoin de récupérer la version de git installée sur votre ordinateur. Vous avez deux possibilités pour le faire :

  • Si vous voulez le faire de manière asynchrone, pour laisser votre client continuer à utiliser l’interface librement, utilisez simplement un call back qui sera appelé à la fin du processus :
$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 vous préférez attendre la réponse du processus, utilisez simplement .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)

Continuons avec un commit qui attend un message de commit. Dans cet exemple, le processus attend l’entrée standard. Si vous êtes dans une console, cela signifie que la console attend que l’utilisateur entre une valeur :

Dans ce cas, vous pouvez utiliser la fonction .postMessage() pour envoyer votre message et la fonction .closeInput() pour indiquer au processus que le message est envoyé :

$param:=New object
$param.currentDirectory:=$myProjectDirectory

$sys:=4D.SystemWorker.new("git commit -F -";$param)
$sys.postMessage("This is my first commit")
$sys.closeInput()

Comme vous pouvez le remarquer, le travailleur système va plus loin que la commande Launch external process pour aller plus loin. Il vous permet de lancer des processus de manière asynchrone et de recevoir facilement les outputStream et errorStream du processus appelé. En outre, vous pouvez utiliser un nouveau moyen de communiquer avec votre processus grâce à la fonction postMessage().

N’oubliez pas de tester cette fonctionnalité avec le HDI ci-dessus et apprenez à l’utiliser pour lancer plusieurs processus en parallèle.

Consultez le centre de développement pour plus de détails !

Fabrice Mainguené
- Product Owner -Fabrice Mainguené a rejoint l'équipe du programme 4D en novembre 2016. En tant que Product Owner, il est en charge de rédiger les user stories puis de les traduire en spécifications fonctionnelles. Son rôle est également de s'assurer que l'implémentation de la fonctionnalité livrée répond au besoin du client.Après avoir obtenu une licence en informatique au CNAM, Fabrice a rejoint une petite société d'édition de logiciels en tant que développeur Windev. Il a ensuite travaillé pour différentes entreprises dans les domaines de l'industrie et du commerce en tant que développeur Windev et web ainsi que conseiller technique sur les nouvelles fonctionnalités.