I processi preemptive sono molto utili per eseguire calcoli estesi in parallelo, utilizzando tutti i core della CPU, ma a volte è necessario delegare i compiti a un processo cooperativo(ad esempio, utilizzando un comando non preemptive). Con il comando New signal è possibile mettere in pausa un processo e attendere la risposta di un altro processo!
Il comando New signal crea un oggetto condiviso e consente di gestire l’interruzione e la continuità del processo corrente. A tale scopo sono disponibili due metodi:
- attendere()
- trigger()
Nell’esempio che segue, dobbiamo aprire un modulo da un processo in pausa. Poiché il Open form window non è preemptive, il processo principale viene chiamato per aprire il modulo e il processo chiamante viene messo in attesa finché l’utente non inserisce un valore.
Per prima cosa, scrivere un metodo che chiami il processo principale e attenda il risultato:
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+
…
Quindi il metodo OpenForm risveglierà il processo con il metodo trigger:
C_OBJECT
$signal($1;$signal;$form)
$signal :=$1
$form :=New object("valore";0)
// Open the form and ask the user for a value
$win :=Open form window("Informazioni";Movable form dialog box)
DIALOG ("Informazioni";$form)
CLOSE WINDOW ($win)
// Add a new attribute to $signal to pass result to other process
Use ($signal)
$signal .result:=$form.valore
End use
// Trigger the signal for the waiting process xml-ph-0034@deepl.inte
trigger()