4D v16 R6 zavádí nový koncept komunikace mezi procesy: sdílené objekty a sdílené proměnné kolekce! Jsou řešením, díky němuž se můžete vyhnout používání meziprocesových proměnných (které nelze používat ve vícevláknovém režimu). Díky tomu budete moci snadno sdílet informace mezi preemptivními procesy.
Nový koncept: sdílené objekty / kolekce
Ve světě počítačového programování platí, že když potřebujete výkon, čím méně dat sdílíte, tím jste efektivnější. Ve většině případů ale samozřejmě musí vámi vytvořené procesy spolu komunikovat. Buď pro odeslání parametrů, nebo pro získání výsledků, nebo prostě pro přístup k nějakým sdíleným informacím. To je důvod, proč byly vytvořeny sdílené objekty a sdílené kolekce! (Jen připomínáme, že běžné objekty a kolekce nelze mezi procesy sdílet. Pokud jsou předávány jako parametry, vytváří se kopie těchto objektů).
Sdílené objekty a sdílené kolekce se chovají stejně jako běžné objekty, jen musí být při své instanci deklarovány jako „sdílené“ pomocí následujících nových příkazů: Nový sdílený objekt a Nová sdílená kolekce. Jakmile jsou jednou instancovány, lze je používat přímo, stejně jako všechny ostatní, pro čtení. Není potřeba žádný semafor ani nic jiného, stačí používat sdílené objekty.
Pro zápis nebo modifikaci musí být sdílené objekty obklopeny klíčovými slovy Use a End use. Tato klíčová slova nastavují vnitřní semafory a musí být použita pro přístup k obsahu objektů a kolekcí v režimu zápisu. Použití těchto klíčových slov je opravdu snadné, mnohem jednodušší než semafory jazyka 4D. Jak? Nesmíte je zapomenout uvolnit. Use a End use vždy obklopují proměnné, takže nemůžete zapomenout zámek uvolnit.
$object:=New shared object
$ps:=New process("my process";0; "myprocess";$object) // odesláno jako odkaz
Use ($object)
$object .myAttribute:=10
End use
Jak je použít v jiných procesech?
Možná vás to zajímá: Jak mohu použít sdílený objekt z jiného procesu (jiným způsobem než odesláním parametru)? Jak mohu sdílet bez meziprocesových proměnných?
To řeší „super-sdílený“ objekt. Přístup k tomuto objektu poskytuje nový příkaz Storage, a to pro všechny běžící procesy.
Tento objekt je na každém počítači jedinečný. Jeden (v režimu jednoho uživatele), jinak jeden na klienta a jeden na server. Příkaz Storage vrací sdílený objekt, takže s ním lze manipulovat jako s jakýmkoli jiným sdíleným objektem, ale může obsahovat pouze sdílené objekty nebo sdílené kolekce. (Všimněte si, že komponenty mohou obsahovat i vlastní Storage ).
Use (Storage)
Storage .myCollection:=New shared collection
End use
Výhody
Sdílené objekty a sdílené kolekce mají oproti standardním meziprocesním proměnným mnoho výhod, jako např:
- při čtení není potřeba ochrana: rychlý přístup
- Klíčová slova Use a End Use zabraňují chybám v kódování, které vedou ke scénářům slepé uličky.
- protože objekty nebo kolekce jsou obvykle hierarchické (obsahují další objekty nebo kolekce), uzamčením objektu uzamknete celý řetězec najednou, což zvyšuje výkon.
Na sdílené objekty a kolekce si rychle zvyknete a stane se to pro vás přirozeným způsobem programování 🙂