Sincronizzare facilmente i processi

Tradotto automaticamente da Deepl

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.intetrigger()

Fabrice Mainguené
- Product Owner -Fabrice Mainguené si è unito al team di 4D Program nel novembre 2016. In qualità di Product Owner, è incaricato di scrivere le storie degli utenti e di tradurle in specifiche funzionali. Il suo ruolo è anche quello di assicurarsi che l'implementazione della funzionalità fornita soddisfi le esigenze del cliente.Dopo aver conseguito una laurea in Informatica presso il CNAM, Fabrice è entrato a far parte di una piccola società di pubblicazione di software come sviluppatore Windev. In seguito ha lavorato per diverse aziende del settore industriale e commerciale come sviluppatore Windev e web e come consulente tecnico su nuove funzionalità.