Promotic
WikipediaLinkedInYoutubeTwitterFacebook

Jak spouštět vybrané skripty v jiném vlákně (threadu)

Standardně všechny skripty v aplikaci PROMOTIC běží v jednom vlákně (v Main threadu). Znamená to například že pokud jeden script běží, pak další skripty musí čekat, až běžící script skončí. Nelze tedy například vytvářet nekonečné smyčky (např. pomocí VBScript příkazů Do...Loop, For...Next, atd.) pro testování proměnné a ukončit smyčku až proměnná získá požadovanou hodnotu. Takový přístup nekonečným testováním není v systému PROMOTIC přípustný !

Znamená to však také, že když například ve skriptu spustíme synchronní metodu Pm.FileCopy pro kopírování velkého souboru na síťový disk, pak tento příkaz neskončí (a tedy neskončí aktivní script), dokud není soubor skutečně zkopírován! Po celou tuto dobu však neběží jiné skripty!

 
Pro řešení problému tohoto druhu je proto umožněno spouštět skripty v jiném threadu (vlákně). Lze to provést jen za pomocí objektu PmSequencer. Pokud v tomto objektu v konfigurační záložce Sequencer v konfigurátoru Použité vlákno (thread) je zvoleno Normal, BelowNormal nebo AboveNormal, pak se bude událost onStep tohoto objektu spouštět ve vlákně s normální, nižší nebo vyšší prioritou. Počáteční hodnoty do tohoto vlákna lze přenést pomocí parametrů Val1, Val2 a Val3 metody PmSequencer.Add. Skript pak nad těmito hodnotami může v uživatelském vlákně pracovat (libovolně dlouhou dobu a paralelně se skripty běžícími v Main threadu). Z uživatelského vlákna lze pak zase opačně spouštět skripty v Main threadu voláním metod objektu PmFolder - viz vlastnost PmObject.Methods.
 
Upozornění! Použije-li se jiné vlákno (thread), pak přístup k ostaním objektům ze skriptu probíhá v jiném než hlavním vlákně a je nutno vzít v úvahu případné problémy se synchronizací při čtení a zápisu do Promotic objektů. Tato volba je vhodná zejména pro časově náročné výpočetní úkony na pozadí.
 
Problém se synchronizací (konsistencí) čtení a zápisu dat (při použití jiného vlákna) lze řešit několika způsoby. Jedním ze základních způsobů je rozdělení celé činnosti na 3 kroky. A to čtení dat z aplikace, zpracování dat a zápis výsledných dat do aplikace (každý krok je implementován vyvoláním události onStep). Krok čtení a krok zápisu pak lze nechat vyvolat v hlavním vlákně (nedojde k problémům se synchronizací dat) a krok zpracování dat pak lze nechat vyvolat v pracovním vlákně. Určení, zda má být krok proveden v hlavním nebo pracovním vlákně lze určit v parametru Params metody PmSequencer.Add. Čtení dat z aplikace a zápis dat zpět do aplikace pak probíhají v hlavním vlákně a vlastní zpracování dat pak probíhá v samostatném pracovním vlákně a nezdržuje hlavní vlákno. Jednotlivé kroky si musí předávat vyčtená a zpracovávaná data. Nejjednodušší k předání je vytvořit ve skriptu daného kroku (událost onStep) pomocné pole a předat je jako parametr Val2 metody PmSequencer.Add. Existuje samozřejmě také možnost předávat si data v objektu PmData. Použití viz Příklad časově náročného zpracování v pracovním vlákně.
© MICROSYS, spol. s r. o.Tavičská 845/21 703 00 Ostrava-Vítkovice