Einen externen Prozess asynchron starten

Manchmal muss man Prozesse im Hintergrund laufen lassen, und sobald ein Prozess beendet ist, einige Aktionen entsprechend seinem Exit-Code ausführen. Ab v19 R4 können Sie mit der neuen Klasse 4D.SystemWorker einen Prozess im Hintergrund starten und automatisch Callback-Methoden ausführen, wenn der Prozess Informationen zurückgibt. Auf diese Weise bleibt die Benutzeroberfläche Ihrer Anwendung während der Ausführung des externen Prozesses ansprechbar, und wenn er fertig ist, können Sie dem Benutzer das Ergebnis sofort anzeigen!

HDI SystemWorker

Ein SystemWorker ist ein Objekt, das mit dem Konstruktor 4D.SystemWorker.new(Prozess) erstellt wird. Er erzeugt einen neuen Worker, der den als Parameter übergebenen Prozess startet und bis zu dessen Ende wartet.

Im Folgenden finden Sie einige Beispiele für die Ausführung verschiedener Git-Befehle mit einem SystemWorker.

Fangen wir ganz einfach an und stellen uns vor, Sie müssen die auf Ihrem Computer installierte Git-Version abrufen. Sie haben zwei Möglichkeiten, dies zu tun:

  • Wenn Sie es asynchron tun wollen, damit Ihr Client die Schnittstelle weiterhin frei nutzen kann, verwenden Sie einfach einen Rückruf, der am Ende des Prozesses aufgerufen wird:
$param:=New object
// Close the process after 2s if not already terminated
$param.timeout:=2
// Callback formula called when the response is totaly received by the systemworker
$param.onResponse:=Formula(ALERT($1.response))
// Start the system worker with the parameter defined above
$sys:=4D.SystemWorker.new("git --version"; $param)
  • Wenn Sie lieber auf die Antwort des Prozesses warten wollen, verwenden Sie einfach .wait():
$param:=New object
// Close the process after 2s if not already terminated
$param.timeout:=2
// Start the system worker with the parameter defined above
$sys:=4D.SystemWorker.new("git --version";$param)

// Wait for the end or the process and return the response from Git
ALERT($sys.wait().response)

Fahren wir mit einem Commit fort, der auf eine Commit-Nachricht wartet. In diesem Beispiel wartet der Prozess auf die Standardeingabe. Wenn Sie sich in einer Konsole befinden, bedeutet dies, dass die Konsole auf die Eingabe eines Wertes durch den Benutzer wartet:

In solchen Fällen können Sie die Funktion .postMessage() verwenden, um Ihre Nachricht zu senden, und die Funktion .closeInput(), um dem Prozess anzuzeigen, dass die Nachricht gesendet wurde:

$param:=New object
$param.currentDirectory:=$myProjectDirectory

$sys:=4D.SystemWorker.new("git commit -F -";$param)
$sys.postMessage("This is my first commit")
$sys.closeInput()

Wie Sie sehen können, geht der Systemworker weiter als der Launch external process Befehl. Er ermöglicht es Ihnen, Prozesse asynchron zu starten und einfach den outputStream und den errorStream des aufgerufenen Prozesses zu erhalten. Darüber hinaus können Sie über die Funktion postMessage() eine neue Art der Kommunikation mit Ihrem Prozess nutzen.

Vergessen Sie nicht, diese Funktion mit dem obigen HDI zu testen und zu lernen, wie Sie damit mehrere Prozesse parallel starten können.

Besuchen Sie das Developer Center für weitere Details!

Fabrice Mainguené
- Product Owner -Fabrice Mainguené gehört seit November 2016 zum 4D Program Team. Als Product Owner ist er verantwortlich für das Schreiben der User Stories und deren Umsetzung in funktionale Spezifikationen. Seine Aufgabe ist es auch, sicherzustellen, dass die gelieferte Funktionsimplementierung den Kundenanforderungen entspricht.Nach seinem Bachelor-Abschluss in Informatik am CNAM arbeitete Fabrice als Windev-Entwickler bei einem kleinen Software-Verlag. Danach arbeitete er für verschiedene Unternehmen in Industrie und Handel als Windev- und Webentwickler sowie als technischer Berater für neue Funktionen.