Unser VP of Engineering, Laurent Esnault, erklärt in seiner Break Out Session den Austausch von Informationen zwischen mehreren Prozessen UND zwischen Prozessen und Formularen: Preemptive Multi-threading auf dem 4D Summit 2016. Dank preemptivem Multi-Threading können Sie mehr parallele Prozesse haben und somit mehr und mehr Benutzer hinzufügen, sowohl für Desktop- als auch für Web-Anwendungen.
Wenn Sie Laurents Session auf dem 4D Summit 2016 verpasst haben, sehen Sie sich dieses 15-minütige Video an und genießen Sie eine persönliche Schulung durch den Meister des präemptiven Multi-Threading!
Voraussetzungen
Um die Vorteile von preemptivem Multi-Threading zu nutzen, müssen Sie Folgendes verwenden
- nur 64-Bit
- kompilierter Modus
- nur den Befehl preemptive-ready
- Keine Interprozess-Variablen
- Keine Benutzerschnittstelle
Aber keine Angst! Wir haben einige leistungsstarke und einfache Lösungen, die wir im Detail mit anschaulichen Beispielen vorstellen werden.
Wie man Informationen zwischen Prozessen austauscht
Wenn Sie im präemptiven Modus keine Interprozessvariablen haben, wie können Sie dann Informationen zwischen den Prozessen austauschen? Aus diesem Grund führen wir ein neues Konzept ein: „Arbeiter“. Aber was genau ist ein Worker?
Gut, dass Sie fragen! Es handelt sich um ein Nachrichtenfenster, das mit einem Prozess verbunden ist, der speziell für die Ausführung seiner Nachrichten zuständig ist. Mit dem Befehl CALL WORKER können Sie eine Nachricht von einem Prozess an einen anderen senden (um ihm Informationen zu übermitteln oder ihn aufzufordern, etwas zu tun). Die Syntax dieses Befehls ist der des New process Befehl, d. h. Sie können einen beliebigen Parameter und/oder eine Projektmethode übergeben.
Lassen Sie uns eine kleine Animation verwenden, um besser zu verstehen, wie es funktioniert:
In diesem Beispiel wollen wir Informationen vom Anwendungsprozess an den myWorker-Prozess weitergeben. Der Anwendungsprozess läuft und der myWorker-Prozess ist angehalten.
- Im Anwendungsprozess wird der CALL WORKER Befehl aufgerufen, um einige Parameter an myWorker zu übergeben, und wir wollen, dass myWorker die Projektmethode myMethod ausführt.
- Er erstellt eine Nachricht, die asynchron an ein Nachrichtenfeld gesendet wird, das dem myWorker-Prozess zugeordnet ist. Die Flagge ist oben, so dass der Worker automatisch erwacht und die Nachricht abholt, den Inhalt (die Parameter) abruft und myMethod ausführt.
- Wenn der myWorker-Prozess die Ausführung von myMethod abgeschlossen hat, wird er nicht beendet. Er wird lediglich angehalten und wartet auf eine weitere Nachricht, die ausgeführt werden soll. Dies ist der Hauptunterschied zum New process Befehl, der einen Prozess erstellt, eine Methode mit einigen Parametern ausführt und dann stirbt.
Wann also stirbt ein Worker? Im Grunde genommen stirbt er, wenn Sie die Anwendung schließen oder wenn Sie den KILL WORKER Befehl aufrufen. Der Prozess wird nicht abrupt beendet, sondern es wird lediglich eine Nachricht an den Worker gesendet, die ihn auffordert, Selbstmord zu begehen.
Demonstration: Worker
Werfen Sie einen Blick auf die Beispieldatenbank, die für die Demonstration verwendet wurde, mit den entsprechenden Erklärungen in Vanessas Beitrag über Worker.
Wie man von präemptiven Prozessen auf die Benutzeroberfläche zugreift
Vorhin haben wir gesagt, dass man von einem präemptiven Prozess aus nicht auf die Benutzeroberfläche zugreifen kann. Offensichtlich mussten wir dafür eine Lösung anbieten. Daher die Einführung des CALL FORM Befehls. Dieser Befehl ist ähnlich wie der CALL WORKER Befehl. Diesmal handelt es sich jedoch nicht um ein Nachrichtenfeld, das mit einem Prozess verbunden ist, sondern um ein Nachrichtenfeld, das mit einem Fenster verbunden ist.
CALL FORM ermöglicht es Ihnen, eine Nachricht an ein Fenster zu senden, um das darin laufende Formular aufzufordern, eine Methode mit einigen Parametern auszuführen.
Lassen Sie uns das Konzept noch einmal anhand einer kleinen Animation demonstrieren:
In diesem Beispiel wollen wir aus einem Prozess (der präemptiv sein kann) oder einem Worker heraus etwas in einem laufenden Formular im selben oder einem anderen Prozess tun.
- Wir rufen den CALL FORM Befehl auf und übergeben die Fensterreferenznummer(d. h. den Long-Int-Wert, der vom Open form window Befehl zurückgegeben wurde) im Eingabeparameter als die Projektmethode, die wir ausführen wollen(myMethod), mit einigen Parametern.
- Es wird eine Nachricht erstellt, die asynchron in ein mit dem Fenster verbundenes Nachrichtenfeld gesendet wird.
- Der Prozess, der das Fenster bearbeitet, erkennt automatisch, dass er eine Nachricht erhalten hat. Er holt die Nachricht ab und führt die Methode myMethod und ihre Parameter aus.
- Dann fährt der Prozess fort, das Fenster „wie gewohnt“ zu behandeln (mit Ereignissen wie dem Drücken der Taste, dem Herunterdrücken der Maus usw.).
Wie Sie sehen können, ist dies dem vorherigen Beispiel über Worker sehr ähnlich.
Demonstration: Nachrichtenaustausch zwischen Formularen
Sehen Sie sich die Beispieldatenbank an, die für die Demonstration verwendet wurde, mit den entsprechenden Erklärungen in Vanessas Beitrag über die Nachrichtenübermittlung zwischen Formularen.