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!
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!