Strona 1 z 1

Przechowywanie danych między różnymi vi'jami

: 12 gru 2011 09:36
autor: spec.kolombo
Aktualnie tworzę taki programik który uruchamia po kolei różne vi'je (coś a'la Test Stand). Te vi'je generują różne dane. Dane te mają być widoczne we wszystkich uruchamianych vi'jach. W związku z tym zastanawiam się nad sposobem przekazywania danych między tymi vi'jami. Miałbym do tego dodatkowo tablicę zawierającą nazwy zmiennych i ich typy. Mam 3 kandydatów:
1. CVT (Current Value Table) - jest taka biblioteka, którą można sobie ściągnąć. Opis znajduje się na stronie: http://zone.ni.com/devzone/cda/epd/p/id/5326
Tak ogólnie i w skrócie, polega to na przechowywaniu danych w tablicy (jedna dla każdego rodzaju, przechowywana jako Functional Variable) i dostęp do danych odbywa się poprzez podanie "adresu" do komórki w tablicy.
2. Functional Global Variable, ale używane w trybie reentrant - musiałbym przechowywać referencję do każdej zmiennej i stworzyć jakieś api do w miarę komfortowego używania.
3. (mój faworyt) Przechowywanie danych w kolejkach. Każdy typ danej by miał swój rodzaj kolejki, a nazwa zmiennej określałaby nazwę kolejki.

Pytanie jednak najważniejsze: która z metod jest najwydajniejsza? Albo pytania alternatywne: czy metoda 3 jest w miarę wydajna? jakie ma wady?
Dodatkowym problemem może być to że co jakiś czas chciałbym dodawać nowe rodzaje zmiennych (w miarę jak będę dodawał nowe uruchamiane vi'je)

Re: Przechowywanie danych między różnymi vi'jami

: 26 kwie 2012 16:09
autor: smiga
Do tego świetnie nadaje się nowy Actor Framework - poczytaj:
http://decibel.ni.com/content/docs/DOC-17193

Przechowywanie danych między różnymi vi'jami

: 27 kwie 2012 08:54
autor: spec.kolombo
Dzięki, ale widziałem już to, ale to chyba nie chodzi pod LV2009.

Swoją drogą w rezultacie i tak zmieniłem koncepcję i to 2 razy...
Próbowałem to zrobić na Data Value Reference, ale napotykałem różne trudności.
Np. każdą wartość (niezależnie od typu danej) chciałem konwertować do stringa. Każdy program który chciał to robić najpierw musiał określać typ danej.
a zakładałem że typy danych będą z czasem dodawane, więc trzeba by zmieniać też te wszystkie inne programy które robią konwersję do stringa...
Jeszcze gorsze było to, że trzeba było zmieniać program główny (bo tam kasowałem te dane, a żeby skasować trzeba było dopisywać obsługę nowych zmiennych). Co prawda miałem to wszystko w specjalnym silniku zmiennych, ale to już inna historia...
Ogólnie nie godząc się na stopień skomplikowania szukałem dalej, aż trafiłem na obiektowe podejście do sprawy.
I jak zbawienie objawił mi się dynamic dispatching rozwiązując 3582 problemy.
Na razie dopiero się uczę podejścia obiektowego, ale opiszę jak to robię teraz:
Mam klasę główną "zmienna" która ma nazwę, oraz metody "init" "destroy" oraz "To String" (i one są zrobione dynamic dispatching).
gdy tworzę nową zmienną to dziedziczę z tej klasy i nadpisuję/dopisuję te metody. Każda nowa zmienna ma daną oraz atrybuty (zrobione na zasadzie DVR). Do tego mam stworzoną tablicę (functional variable), która przechowuje te obiekty i różne programy mogą sobie je pobierać i działać na nich.
Teraz jak jakiś program wywoła metodę "To String" to LV samo sobie znajduje odpowiedniego VI'ja którego ma użyć dla danej zmiennej.
Tak samo nie trzeba zmieniać programu głównego. I do tego łatwo skopiować całą klasę i stworzyć nowy rodzaj danych.