Promotic

Jak uruchamiać skrypty w innym wątku (threadu)

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.
Patrz również:
- PmaSequencer (obiekt)
- PmaSequencer.Add (metoda)
- PmaSequencer.onStep (zdarzenie)
- Pm.AppPriority (właściwość)
Nawigacja:
 
 
- Jak uruchamiać skrypty w innym wątku (threadu)
 
 
- SVG
© MICROSYS, spol. s r.o.