Os processos preventivos são muito úteis para realizar cálculos extensivos em paralelo, utilizando todos os núcleos do seu CPU, mas por vezes é necessário delegar tarefas num processo cooperativo(por exemplo, utilizando um comando não preventivo). Com o comando New signal pode interromper um processo e esperar pela resposta de outro processo!
O New signal cria um objecto partilhado e permite gerir a interrupção e continuidade do processo actual. Dois métodos estão disponíveis para tal:
- espera()
- gatilho()
No exemplo abaixo, precisamos de abrir um formulário a partir de um processo preventivo. Uma vez que o Open form window não é preventivo, o processo principal é chamado para abrir o formulário, e o processo de chamada é colocado em espera até que o utilizador introduza um valor.
Primeiro, escrever um método que chama o processo principal e esperar pelo 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.esperar()
// Calculate the results
$calc:=$signal.result +...
Depois o método OpenForm despertará o processo com o 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("Informação";Movable form dialog box)
DIALOG ("Informação";$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
trigger()