Zazwyczaj wszystkie skrypty w aplikacji PROMOTIC
działają w jednym wątku (w wątku głównym). To znaczy, że na przykład jeżeli jeden skrypt działa, wtedy następny musi czekać, aż bieżący skrypty się zakończy.
Nie można na przykład tworzyć nieskończone pętle (np. przy pomocy poleceń
do...while itd.) w celu testowania zmiennej oraz zakończyć pętlę aż zmienna uzyska wymaganą wartość. Takie podejście nieskończonym testowaniem nie jest w systemie PROMOTIC akceptowany!
Awszak to również oznacza, że jeżeli na przykład w skrypcie uruchomisz synchroniczną metodę
Pm.FileCopy w celu kopiowania dużego pliku na dysk sieciowy, wtedy metoda ta nie zakończy się (i wtedy nie zakończy się aktywny skrypt), dopóki plik nie zostanie rzeczywiście skopiowany! Przez cały ten okres nie działają inne skrypty!
Dla rozwiązania tego typu problemu jest dozwolone uruchamiać skrypty w innym wątku (threadu). Można to wykonać tylko
przy pomocy obiektu PmaSequencer.
Jeżeli w tym obiekcie w karcie "
Sequencer" w konfiguratorze "
Zastosowany wątek (thread)" jest zezwolone
Normal,
BelowNormal lub
AboveNormal, wtedy zdarzenie
onStep tego obiektu będzie uruchamiane w wątku o normalnym, niższym lub wyższym priorytecie.
Wartości początkowe można do tego wątku przenieść przy pomocy parametrów
Val1,
Val2 oraz
Val3 metody
PmaSequencer.Add. Wtedy skrypt ponad tymi wartościami może w wątku użytkownika pracować (przez dowolnie długi czas oraz równolegle z skryptami działającymi w wątku głównym).
Z wątku użytkownika następnie można uruchamiać skrypty w wątku głównym przez wywołanie metod obiektu
PmaFolder - patrz właściwość
PmaObject.Methods.
Uwaga! Jeżeli zostanie użyty inny
wątek (thread), wtedy dostęp do pozostałych obiektów w skrypcie przebiega w innym niż w wątku głównym i jest konieczne brać pod uwagę ewentualne problemy synchronizacji przy odczycie i zapisie do
Pma obiektów. Opcja ta jest stosowna zwłaszcza do czasochłonnych czynności obliczeniowych wykonywanych w tle.
Problem z synchronizacją (spójnością) odczytu i zapisu danych (przy zastosowaniu innego wątku) można rozwiązać na kilka sposobów.
Jedny z nich jest rozdzielenie całej operacji na 3 faze. Mianowicie odczyt danych z aplikacji, obróbka danych oraz zapis rezultatu do aplikacji (każda faza jest zaimplementowany przez wywołanie zdarzenia
onStep). Fazę odczytu i zapisu można wywołać w głównym wątku (nie dochodzi do problemów z synchronizacją danych) natomiast fazę obróbki danych można wywołać w wątku roboczym. Określenie, czy faza ma zostać wykonana w głównym czy też w roboczym wątku można określić w parametrze
Params metody
PmaSequencer.Add. Odczyt danych z aplikacji i zapis danych z powrotem do aplikacji wtedy przebiega w wątku głównym a właściwa obróbka danych przebiega w osobnym wątku roboczym i nie wstrzymuje głównego wątku. Poszczególne fazy muszą przekazywać sobie odczytane i opracowane dane. Najprostszym do przekazania jest wytworzenie w skrypcie danej fazy (zdarzenie
onStep) tablicy pomocniczej i przekazanie jej w parametrze
Val2 metody
PmaSequencer.Add. Oczywiście istnieje również możliwość przekazywania danych w obiekcie
PmaData. Zastosowanie patrz
Przykład czasochłonnej obróbki w wątku roboczym.