Náš viceprezident pro inženýrství Laurent Esnault vysvětluje výměnu informací mezi více procesy A mezi procesy a formuláři během své Break Out Session: Preemptivní vícevláknové zpracování na konferenci 4D Summit 2016. Díky preemptivnímu vícevláknovému zpracování můžete mít více paralelních procesů, a tím přidávat další a další uživatele, ať už pro desktopové nebo webové aplikace.
Pokud jste Laurentovu relaci na 4D Summitu 2016 nestihli, podívejte se na toto 15minutové video a užijte si osobní školení od mistra preemptivního vícevláknového zpracování!
Předpoklady:
Abyste mohli využívat výhod preemptivního vícevláknového zpracování, budete muset používat:
- Pouze 64bitové
- zkompilovaný režim
- pouze příkaz preemptive-ready
- žádné meziprocesové proměnné
- Žádné uživatelské rozhraní
Ale nebojte se! Máme pro vás několik výkonných a snadných řešení, která si podrobně představíme na názorných příkladech.
Jak sdílet informace mezi procesy
Pokud nemáte meziprocesové proměnné v preemptivním režimu, jak sdílet informace mezi procesy? Proto zavádíme nový koncept: „pracovníků“. Ale co přesně je to pracovník?
Jsem rád, že jste se zeptali! Jedná se o okno zpráv spojené s procesem speciálně určeným k provádění jeho zpráv. Pomocí CALL WORKER příkazu můžete odeslat zprávu z jednoho procesu do druhého (poslat mu informaci nebo ho požádat, aby něco udělal). Syntaxe tohoto příkazu je dost podobná příkazu New process příkazu, např. můžete předat libovolný parametr a/nebo metodu projektu.
Použijme malou animaci, abychom lépe pochopili, jak to funguje:
V tomto příkladu chceme předávat informace z procesu aplikace do procesu myWorker. Proces aplikace běží a proces myWorker je pozastavený.
- V procesu aplikace se CALL WORKER je zavolán příkaz, který předá nějaké parametry myWorker, a my chceme, aby myWorker provedl metodu projektu myMethod.
- Vytvoří zprávu, která je asynchronně odeslána do schránky zpráv určené pro proces myWorker. Příznak je nahoře, takže proces Worker se automaticky probudí a vyzvedne zprávu, načte její obsah (parametry) a provede myMethod.
- Když proces myWorker dokončí provádění myMethod, nezemře. Pouze se pozastaví a čeká na další zprávu, která se má vykonat. To je hlavní rozdíl oproti New process příkazu, který vytvoří proces, provede metodu s nějakými parametry a pak zemře.
Kdy tedy pracovník zemře? V zásadě zemře, když zavřete aplikaci nebo když zavoláte příkaz KILL WORKER příkaz. Nedojde k náhlému usmrcení procesu, ale pouze k odeslání zprávy workeru s žádostí o spáchání sebevraždy.
Ukázka: Workery
Podívejte se na ukázkovou databázi použitou pro demonstraci s příslušnými vysvětlivkami v příspěvku Vanessy o workerech.
Jak přistupovat k uživatelskému rozhraní z preemptivních procesů
Dříve jsme si řekli, že z preemptivního procesu nelze přistupovat k uživatelskému rozhraní. Je zřejmé, že jsme pro to museli poskytnout řešení. Proto jsme zavedli funkci CALL FORM příkazu. Tento příkaz je podobný příkazu CALL WORKER příkazu. Tentokrát se však nejedná o okno zprávy přiřazené procesu, ale o okno zprávy přiřazené oknu.
CALL FORM Umožňuje odeslat zprávu oknu a požádat formulář běžící v něm o provedení metody s určitými parametry.
Pro demonstraci konceptu opět použijeme malou animaci:
V tomto příkladu chceme z procesu (který může být preemptivní) nebo z workeru něco provést v běžícím formuláři v tomtéž nebo jiném procesu.
- Voláme CALL FORM příkaz a předáme referenční číslo okna( tj. hodnotu long int vrácenou příkazem Open form window příkazem) ve vstupním parametru jako metodu projektu, kterou chceme spustit(myMethod) s nějakými parametry.
- Vytvoří se zpráva, která se asynchronně odešle do schránky zpráv přidružené k oknu.
- Proces obsluhující okno automaticky zjistí, že má zprávu. Přijme zprávu a provede metodu myMethod a její parametry.
- Poté proces pokračuje v práci s oknem „jako obvykle“ (zpracovává události jako stisknutí klávesy, stisknutí myši atd.).
Jak vidíte, je to dost podobné předchozímu příkladu o pracovnících.
Ukázka: Posílání zpráv mezi formuláři
Prohlédněte si příklad databáze použité pro demonstraci s odpovídajícími vysvětlivkami v příspěvku Vanessy o zasílání zpráv mezi formuláři.