Los procesos preventivos son muy útiles para realizar cálculos extensos en paralelo, utilizando todos los núcleos de la CPU, pero a veces es necesario delegar tareas a un proceso cooperativo(por ejemplo, utilizando un comando no preventivo). Con el comando New signal puedes pausar un proceso y esperar la respuesta de otro proceso.
El comando New signal crea un objeto compartido y permite gestionar la interrupción y continuidad del proceso actual. Hay dos métodos disponibles para ello:
- esperar()
- desencadenar()
En el ejemplo siguiente, necesitamos abrir un formulario desde un proceso preventivo. Como el Open form window no es preventivo, se llama al proceso principal para abrir el formulario, y el proceso que lo llama se pone en espera hasta que el usuario introduzca un valor.
Primero, escribe un método que llame al proceso principal y espera el resultado:
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+
…
Entonces el método OpenForm despertará el proceso con el método trigger:
C_OBJECT
$signal($1;$signal;$form)
$signal :=$1
$form :=New object("valor";0)
// Open the form and ask the user for a value
$win :=Open form window("Información";Movable form dialog box)
DIALOG ("Información";$form)
CLOSE WINDOW ($win)
// Add a new attribute to $signal to pass result to other process
Use ($signal)
$signal .result:=$form.valor
End use
// Trigger the signal for the waiting process xml-ph-0034@deepl.inte
trigger()