LabVIEWForum.de - Reentrance

LabVIEWForum.de

Normale Version: Reentrance
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo Leute,

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?

Gruss, Eugen
Hallo Eugen,

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.

Viele Grüße
Andreas
Ja, ok.

Wie sieht es aus, wenn mein reentrantes VI langsam läuft, wird aber schnell aufgerufen? Gibt es dann Problem mit dem Speicher?

Gruss, Eugen
Hallo,

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.

Gruß
sven
<div align="left">Hallo, Leute,

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>
Hallo Jens,

also dein Beispiel verstehe ich nicht ganz. Verstehe auch nicht wozu es gut sein soll. Sorry.

Für benutzerdefinierte Events kannst du benutzerdefinierte Events definieren und in die Eventstruktur einbinden. Oder meinst du etwas anderes?

Gruss, Eugen
Hier mein Beispiel zum besseren Verständnis.

[attachment=3679]
[attachment=3680]

Gruss, Eugen
<div align="left">Hallo, Eugen,

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!! Smile </div>
' 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 gewartetWink(Glückwunsch und so ...)

Literatur: (leider in Englisch) [attachment=3685]

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.

Grüße
CB
Danke für euere Antworten. Das Beispiel mit TCP-Server erklärt mir am besten, wo ich Reentrance anwenden kann.

Meine Frage besteht aber weiterhin.
Was passiert wenn ich ein reentrantes VI schneller aufrufe, als das VI ausgeführt wird?

Ansonsten ist mir eigentlich alles klar.

Gruss, Eugen
Seiten: 1 2
Referenz-URLs