| 
  
  
    
      
      
      
         V systému Control Web je od verze 6 možné spouštět
        aplikaci jako službu (servis). Taková aplikace je spuštěna ihned po
        startu operačního systému, běží na pozadí a bez ohledu na to jestli je
        přihlášený nějaký uživatel. Aplikaci jako službu je možné spouštět
        například na počítačích, kde není nikdo přihlášený nebo kde se
        přihlášení uživatelé mění a aplikace má neustále běžet. 
         
  
        Hlavní nevýhodou je, že aplikaci nevidíme (ani pokud se k počítači
        přihlásíme). Testování nebo ladění takové aplikace může být
        náročnější. Je zde však ještě jedno omezení, které není na první
        pohled vidět, ale které je při vývoji aplikace běžící jako servis
        klíčové. Aplikace běžící jako servis je spuštěna v prostředí
        operačního systému, které má oproti prostředí pro klasické aplikace
        omezené prostředky. Služby jsou v operačním systému od toho, aby
        prováděly na pozadí nějakou nezbytnou činnost (například hlídání
        aktualizací, kontrola zabezpečení a podobně), které ale zásadně
        nezatěžují běh počítače. Běží "nenápadně" na pozadí. Spustit například
        řízení rozsáhlé technologie s archivací, web serverem a spoustou
        komunikací jako službu operačního systému není rozhodně dobrý
        nápad. 
        Paměť
          
          
            V čem je tedy prostředí služby omezené oproti běhu klasické
            aplikace? Každá aplikace běžící v operačním systému Windows
            používá některé systémové prostředky. Nejznámějším prostředkem,
            který aplikace používají, je paměť. Aplikace, které jsou 32bitové,
            mají k dispozici 2GB paměti, pokud běží v 32bitovém operačním
            systému. V některých případech 3GB paměti pokud běží v 64bitovém
            operačním systému. 64bitové aplikace mají teoreticky k dispozici
            až 256 TB. Stejné omezení platí také pro aplikace běžící jako
            servis. Tady tedy rozdíl mezi klasickou a "servisovou" aplikací
            není. 
          
        
        Zásadní rozdíl uvidíme až u následujících prostředků. Aplikace dále
        využívají Popisovače (handles), uživatelské objekty (user
        objects) a GDI objekty (GDI objects). 
        Popisovače (Handles)
          
          
            Popisovač - handle je datová struktura, která odkazuje na
            nějaký objekt v operačním systému. Pokud to hodně zjednodušíme,
            můžeme operační systém požádat, aby nám vytvořil určitý objekt,
            který potřebujeme pro svoji práci. Operační systém ho vytvoří a
            vrátí nám handle (odkaz) na vytvořený objekt. Pomocí tohoto odkazu
            můžeme s objektem dále pracovat (například ho na konci práce zase
            smazat). Handle se používá třeba při práci se soubory. Pro nás je
            důležité, že počet handlů je omezený (maximální počet je zhruba 16
            miliónů).  
            Správně naprogramovaná aplikace toto omezení nikdy nepřekročí.
            Problém může nastat například v aplikacích, které nějaké objekty
            vytváří, ale zapomenou je zrušit, když už je nepotřebují. Pokud
            běží hodně dlouho, systémové prostředky pak dojdou a požadavek o
            vytvoření dalšího objektu selže. Aplikace pak pravděpodobně
            přestane pracovat nebo rovnou "spadne".  
            Pokud se libovolná aplikace (netýká se to pouze systému
            Control Web) dostává po delší době běhu do
            problémů, je užitečné podívat se do Správce procesů. V
            záložce podrobnosti si zapnout sloupce Popisovače (Handles),
            Objekty users (User objects) a Objekty GDI (GDI objects). Pokud se
            hodnota v některém sloupci blíží svému limitu, je to důležitá
            informace o chybě v aplikaci (je extrémně důležité toto sdělit při
            komunikaci s technickou podporou výrobce dané aplikace). 
            
          
        
        Uživatelské objekty (User objects)
          
          
            Dalším prostředkem operačního systému jsou uživatelské
            objekty (user objects). To jsou objekty, které si aplikace
            vytváří pro komunikaci s uživatelem (okna, menu, lišty s nástroji)
            nebo pro komunikaci s operačním systémem, jinými procesy nebo také
            komunikaci s jiným zařízením (například pro komunikaci s PLC s
            využitím Modbus TCP nebo web server pro komunikaci s klienty).
            Počet těchto objektů má tři omezení.  
            První omezení nedovolí jednomu procesu vytvořit více než 10
            000 uživatelských objektů. Na toto omezení můžeme narazit i v
            klasické aplikaci. Pokud v rozsáhlé aplikaci používáme panely ve
            vykreslovacím režimu gdi (graphics_mode=gdi), každý
            přístroj je objektem operačního systému a tedy spotřebuje
            minimálně jeden uživatelský objekt. Pokud počet 10 000 překročíme,
            projeví se to v aplikaci tak, že některé části přestanou být
            viditelné. Tady je řešení jednoduché. Stačí u panelů nastavit
            parametr graphics_mode na některý pokročilejší
            vykreslovací režim (gdi_offscreen, gdi_plus,
            direct2d, open_gl). Potom je pouze samotný panel
            objektem operačního systému, ale přístroje v něm už objekty
            operačního systému nejsou a tedy uživatelské objekty
            nespotřebovávají.  
            Pro uživatelské objekty existují bohužel ještě další omezení.
            Všechny aplikace v jedné session (zjednodušeně řečeno je to
            prostředí vytvořené pro přihlášeného uživatele) mohou vytvořit
            65 535 uživatelských objektů. Pokud tento počet aplikace
            společně překročí, stane se další práce s operačním systémem i
            aplikacemi prakticky nemožnou. Většinu aplikací není možné ani
            ukončit (pro ukončení potřebují vytvořit několik objektů například
            pro uložení do souboru). Ze stejných důvodu se nepovede ani
            odhlásit nebo restartovat.  
          
        
        Servis a uživatelské objekty
          
          
            Pro aplikace běžící jako služba je klíčové poslední omezení.
            Všechny uživatelské objekty se vyváří v určité části paměti, která
            je pro tyto účely vyhrazena a má omezenou velikost (tato oblast se
            označuje jako desktop heap). Tato paměť je společná pro
            jeden desktop. Desktop si zase můžeme představit jako prostředí v
            němž je přihlášen jeden uživatel a běží jeho aplikace. Velikost
            této paměti je v různých verzích operačního systému různá. Ve
            Windows 10 je nastavená tak, aby zhruba odpovídala velikosti
            potřebné pro vytvoření 65 535 objektů (objekty nemusí být stejně
            veliké). Pro "interactiv desktop", tedy prostředí přihlášeného
            uživatele, je to 20MB. 
            Ale pozor, pro non-interactiv desktop (prostředí v němž běží
            služby operačního systému) je to pouze 768KB. Všechny
            aplikace systému Control Web, které běží jako
            služba, běží společně - tedy mají jeden desktop heap (velký
            768KB). Počet uživatelských objektů, které mohou vytvořit aplikace
            běžící jako služba, je tedy podstatně menší. 
            Rozsáhlejší aplikace je tedy vždy lepší spustit například pod
            automaticky přihlašovaným uživatelem, tedy v normálním prostředí s
            menším omezením prostředků operačního systému. 
            Velikost non-interactiv desktop heap je možné v nastavení
            operačního systému zvětšit. Podrobný popis je například zde. Je potřeba si uvědomit, že se tím zvětší
            velikost vyhrazené paměti všech desktop heapů, které se vyváří pro
            každý desktop. V operačním systému běží služeb velké množství a
            proto je potřeba tuto velikost nastavit "rozumně" (také proto není
            toto nastavení jednoduše přístupné běžným uživatelům). 
          
        
        
      
    
  
 |