Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
wer kann mir genau und kompetent sagen was mit Reentrance in LV gemeint ist?
Mein Wissensstand:
Reentrant bedeutet:
- es wird nicht gewartet bis das reentrante VI ausgeführt wird
- es wird ein neuer Speicherbereich bei jedem Aufruf reserviert und nach der Ausführung wieder frei gegeben. Speicherbereich für Daten(Variablen) und Code. Sprich es wird eine komplett neue Kopie des reentranten VIs erstellt(ähnlich wie .vit)
Wo muss ich Reentrance optimal einsetzen?
Kann man eine Task reentrant definieren? (vielleicht in ein extraVI packen und reentrant definieren)
Hat jemant gute Tutorials oder Literatur dazu?
meines Wissens liegst Du mit Deiner Annahme richtig.
Ein Einsatz von reentranten VI's sehe ich bei rekursiven Funktionen, die sonst nicht möglich wären.
Es ist damit also auch möglich, daß sich ein VI selbst aufruft.
Was Du unter einem reentranten Task verstehst begreife ich in diesem Zusammenhang nicht.
bevor ich mich vertue, Reentrant sind doch ablaufinvariant, oder?
Ich nutze sehr viele ablaufinvariante SubVI's für meine Tester. Ich teste gleichzeitig bis zu 6 Karten und daher rufe ich das SubVI gleich 6 mal auf. Um Zeit zu sparen habe ich diese ablaufinvariant gemacht. Klappt eigentlich ganz gut. Man muss nur mit Zugriffen auf Hardware aufpassen.
Doku habe ich baer leider keine dazu. Alles Try and Error.
benutze (habe benutzt) reentrant/ablaufinvariant z.B. bei einem "ValueChange"-SubVI. Es ermöglicht mir recht einfach, benutzerdefinierte Events in die Eventstruktur einzubauen, ohne das ich die überwachte "Variable" über ein Shift-Register mitschleifen muss.
Damit ich auch mehrere Variablen parallel überwachen kann, muss der Code natürlich reentrant sein.
MfG, Jens</div>
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
also ich habe dies in LV7 verwendet, um eine Änderung der Skala eines Graphen durch den Anwender mitzubekommen. Da es damals noch kein Scale-Change-Event gab, mußte ich also im Timeout-Case der Eventstruktur immer wieder die Skalenwerte per Property-Node auslesen (zumindest ist mir damals nichts besseres eingefallen).
Jetzt muss ich ja feststellen, ob sich der Wert geändert hat gegenüber dem vorherigen Schleifendurchlauf, also jetzt 2 Möglichkeiten: Entweder vorherigen Wert per Shift-Register im "Haupt-VI" durchschleifen oder halt in einem Sub-VI der Art, wie es der Screenshot darstellt. Das Sub-VI ist sozusagen der Zwischenspeicher und Ersatz für das Shift-Register im Main-VI. Und es übernimmt gleich der Vergleich und gibt ihn mir als TF-Variable aus, somit gute Anwendbarkeit.
Damit mehrere Aufrufe möglich sind, muss das VI reentrant sein, sonst kommen sich die Aufrufe in die Quere.
Das ganze ist eigentlich nur ein nettes kleines SubVI, um für beliebige Variablen ein ValueChange-Event
mitzubekommen, auch an Stellen, wo man vielleicht keine Event-Struktur einsetzt.
Jetzt klarer?
MfG, Jens
P.S.: Und da ich es gerade sehe: :)Happy Birthday to you!! </div>
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
' schrieb:- es wird nicht gewartet bis das reentrante VI ausgeführt wird
- es wird ein neuer Speicherbereich bei jedem Aufruf reserviert und nach der Ausführung wieder frei gegeben. Speicherbereich für Daten(Variablen) und Code. Sprich es wird eine komplett neue Kopie des reentranten VIs erstellt(ähnlich wie .vit)
Wo muss ich Reentrance optimal einsetzen?
Kann man eine Task reentrant definieren? (vielleicht in ein extraVI packen und reentrant definieren)
Hat jemant gute Tutorials oder Literatur dazu?
Hallo Eugen, ich hab extra bis zu deinem Geburtstag mit der Antwort gewartet(Glückwunsch und so ...)
Rentrant bedeutet:
normalerweise kann in LabVIEW immer nur EINE Instanz eines VIs zu einer Zeit laufen. d.h. wenn man z.B. ein VI zwei mal in eine While-Schleife packt und so verdrahtet, dass sie parallel ausgeführt werden könnten, werden sie aber trozdem nacheinander ausgeführt. LabVIEW entscheidet selbständig, welche Instanz zuerst aufgerufen wird ...
Bei reentranten VIs kann man diese Beschränkung (die eigentlich ein sehr hilfreiches Feature ist) aufheben, dann braucht man aber u.A. mehr Speicher, weil jede Instanz seinen eigenen Datenbereich bekommt.
Wo man es optimal einsetzt kann ich nicht wirklich erklären, ich benutze reentrante VIs, wenn die Problemstellung es verlangt, dass ich ein VI gleichzeitig parallel laufen lassen muss (?). z.B. hab ich mal einen TCP/IP Server gebastelt, der mehrere Verbindungen gleichzeitig bedienen kann. Pro Client, der sich verbindet wird über VI Server ein neues, reentrantes VI gestartet, dass die Kommunikation mit diesem einen, ihm zugewiesenen Client bearbeitet.
Rekursive VI Aufrufe mittels VI Server sind auch ein gutes Beispiel für die Notwendigkeit von reentranten VIs, wurde auch schon genannt.
Der Aufruf des VIs wird, wenn es reentrant ist, eher verlangsamt, weil der Memory Manager immer einen neuen Datenbereich reservieren muss. Der Vergleich mit dem Template hinkt, weil nur der Code und die Daten neu erstellt werden, das VI an sich wird beim Aufruf nicht dupliziert.
An die Task-Verwaltung kommst du nur über den Menüpunkt "Ausführung" ran. Es wird nicht automatisch für jedes reentrante VI ein neuer Thread erstellt, man kann das aber durchaus als Analogie gelten lassen: ein reentrantes VI, in dem z.B. eine While-Schleife läuft, die irgendwelche Inputs / Outputs behandelt kann man als *Thread* betrachten.