Asynchronní spuštění externího procesu

Automaticky přeloženo z Deepl

Někdy je třeba spouštět procesy na pozadí, a jakmile jeden z nich skončí, provést některé akce podle jeho výstupního kódu. Od verze v19 R4 umožňuje 4D spustit proces na pozadí pomocí nové třídy 4D.SystemWorker a automaticky provést metody zpětného volání, když proces vrátí informace. Uživatelské rozhraní vaší aplikace tak zůstane během provádění externího procesu citlivé a po jeho dokončení můžete výsledek ihned zobrazit uživateli!

HDI sytem worker

SystemWorker je objekt vytvořený pomocí konstruktoru 4D.SystemWorker.new(proces). Vytvoří nový worker, který spustí proces předaný v parametru a počká na jeho konec.

Zde uvádíme několik příkladů spouštění různých příkazů systému git pomocí nástroje SystemWorker.

Začněme jednoduše a představme si, že potřebujete načíst verzi systému git nainstalovanou v počítači. Máte dvě možnosti, jak to udělat:

  • Pokud to chcete provést asynchronně, aby váš klient mohl nadále volně používat rozhraní, stačí použít zpětné volání, které bude zavoláno na konci procesu:
$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)
  • Pokud chcete raději počkat na odezvu procesu, stačí použít .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)

Pokračujme revizí, která čeká na zprávu o revizi. V tomto příkladu proces čeká na standardní vstup. Pokud jste v konzoli, znamená to, že konzola čeká na zadání hodnoty uživatelem:

V takovém případě můžete použít funkci .postMessage() pro odeslání zprávy a funkci .closeInput(), která procesu oznámí, že zpráva byla odeslána:

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

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

Jak si můžete všimnout, systémový pracovník jde dále než Launch external process příkazu. Umožňuje asynchronní spouštění procesů a snadné přijímání výstupního proudu (outputStream) a proudu chyb (errorStream) z volaného procesu. Kromě toho můžete použít nový způsob komunikace s procesem prostřednictvím funkce postMessage( ).

Nezapomeňte si tuto funkci vyzkoušet s výše uvedeným HDI a naučte se ji používat pro paralelní spouštění několika procesů.

Podívejte se do vývojářského centra, kde najdete další podrobnosti!

Fabrice Mainguené
- Product Owner -Fabrice Mainguené se připojil k týmu 4D Program v listopadu 2016. Jako Product Owner má na starosti psaní uživatelských příběhů, které následně převádí do funkčních specifikací. Jeho úkolem je také zajistit, aby dodaná implementace funkcí splňovala potřeby zákazníků.Po získání bakalářského titulu v oboru informatiky na CNAM nastoupil Fabrice do malé softwarové vydavatelské společnosti jako vývojář Windev. Poté pracoval pro různé společnosti v oblasti průmyslu a obchodu jako vývojář aplikací Windev a webových aplikací a také jako technický poradce pro nové funkce.