Präemptive Prozesse sind sehr nützlich für die parallele Durchführung umfangreicher Berechnungen, bei denen alle Kerne Ihrer CPU genutzt werden, aber manchmal müssen Sie Aufgaben an einen kooperativen Prozess delegieren(z. B. mit einem nicht präemptiven Befehl). Mit dem New signal Befehl können Sie einen Prozess anhalten und auf die Antwort eines anderen Prozesses warten!
Der Befehl New signal Befehl erstellt ein gemeinsames Objekt und ermöglicht es Ihnen, die Unterbrechung und Fortführung des aktuellen Prozesses zu verwalten. Hierfür stehen zwei Methoden zur Verfügung:
- wait()
- trigger()
Im folgenden Beispiel müssen wir ein Formular von einem präemptiven Prozess aus öffnen. Da der Open form window Befehl nicht präemptiv ist, wird der Hauptprozess aufgerufen, um das Formular zu öffnen, und der aufrufende Prozess wird angehalten, bis der Benutzer einen Wert eingibt.
Schreiben Sie zunächst eine Methode, die den Hauptprozess aufruft und auf das Ergebnis wartet:
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+...
Dann wird die Methode OpenForm den Prozess mit der Methode trigger aufwecken:
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()