Promotic
WikipediaLinkedInYoutubeTwitterFacebook

W jaki sposób uruchamiać skrypty w innym wątku (threadu)

Standardowo wszystkie skrypty w aplikacji PROMOTIC działają w jednym wątku (w Main thread). Oznacza to na przykład że 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ń VBScript Do...Loop, For...Next, 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 oznacza to również, że gdyż na przykład w skrypcie uruchomisz synchroniczną metodę Pm.FileCopy w celu kopiowania dużego pliku na dysk sieciowy, wtady metoda to 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 (thread). Można to wykonać tylko przy pomocy obiektu PmaSequencer. Jeżeli w tym obiekcie w zakładce "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ątkowemoż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 Main thread). Z wątku użytkownika następnie można uruchamiać skrypty w Main thread przez wywołanie metod obiektu PmaFolder - patrz właściwość PmaObject.Methods.
 
Uwaga! Jeżeli zostanie użyte inne włókno (thread), wtedy dostęp do pozosta˛ych obiektów w skrypcie przebiega w innym niż głównym włóknie i jest konieczne brać pod uwagę ewentualne problemy synchronizacji przy odczycie i zapisie do Pma obiektów. Niniejsza opcja 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łókna) 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łóknie (nie dochodzi do problemów z synchronizacją danych) natomiast fazę obróbki danych można wywołać w włóknie roboczym. Określenie, czy faza ma zostać wykonana w głównym czy też w roboczym włóknie można określić w parametrze Params metody PmaSequencer.Add. Odczyt danych aplikacji i zapis danych z powrotem do aplikacji wtedy przebiega w głównym włóknie a właściwa obróbka danych przebiega w osobnym włóknie roboczym i nie wstrzymuje głównego włókna. 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 we włóknie roboczym.
Navigacja:
 
 
- W jaki sposób uruchamiać skrypty w innym wątku (threadu)
 
 
- SVG
© MICROSYS, spol. s r. o.Tavičská 845/21 703 00 Ostrava-Vítkovice