Les processus préemptifs sont très utiles pour effectuer des calculs importants en parallèle, en utilisant tous les cœurs de votre CPU, mais vous devez parfois déléguer des tâches à un processus coopératif(par exemple, en utilisant une commande non préemptive). Avec la commande New signal vous pouvez mettre en pause un processus et attendre la réponse d’un autre processus !
La commande New signal crée un objet partagé et vous permet de gérer l’interruption et la continuité du processus en cours. Deux méthodes sont disponibles pour cela :
- attendre()
- trigger()
Dans l’exemple ci-dessous, nous devons ouvrir un formulaire à partir d’un processus préemptif. Puisque la commande Open form window n’est pas préemptive, le processus principal est appelé pour ouvrir le formulaire, et le processus appelant est mis en attente jusqu’à ce que l’utilisateur entre une valeur.
Tout d’abord, écrivez une méthode qui appelle le processus principal et attendez le résultat :
C_OBJECT($signal)
// Creation of a signal
$signal :=New signal
// call main process and execute OpenForm method
CALL WORKER (1 ; "OpenForm" ;$signal)
// do another calculation
...
// Waiting for the end of the process
$signaled :=$signal.wait()
// Calculate the results
$calc:=$signal.result+
…
Ensuite, la méthode OpenForm va réveiller le processus avec la méthode trigger:
C_OBJECT
$signal($1;$signal;$form)
$signal :=$1
$form :=New object("value";0)
// Open the form and ask the user for a value
$win :=Open form window("Information" ;Movable form dialog box)
DIALOG ("Information" ;$form)
CLOSE WINDOW ($win)
// Add a new attribute to $signal to pass result to other process
Use ($signal)
$signal .result:=$form.value
End use
// Trigger the signal for the waiting process xml-ph-0034@deepl.inte
trigger()