Preemptivní procesy jsou velmi užitečné pro provádění rozsáhlých paralelních výpočtů s využitím všech jader procesoru, ale někdy je třeba delegovat úlohy na spolupracující proces(např. , pomocí nepreemptivního příkazu). Pomocí New signal můžete pozastavit proces a čekat na odpověď jiného procesu!
Na adrese New signal Příkaz vytvoří sdílený objekt a umožní vám řídit přerušení a pokračování aktuálního procesu. K tomu jsou k dispozici dvě metody:
- čekat()
- spustit()
V níže uvedeném příkladu potřebujeme otevřít formulář z preemptivního procesu. Vzhledem k tomu, že Open form window příkaz není preemptivní, je pro otevření formuláře zavolán hlavní proces a volající proces je pozastaven, dokud uživatel nezadá hodnotu.
Nejprve napište metodu, která zavolá hlavní proces a počká na výsledek:
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+...
Pak metoda OpenForm probudí proces metodou 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()