INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Reentrance



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!

18.10.2006, 22:20
Beitrag #1

eg Offline
LVF-SeniorMod


Beiträge: 3.868
Registriert seit: Nov 2005

2016
2003
kA

66111
Deutschland
Reentrance
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

Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
19.10.2006, 07:26
Beitrag #2

A.Berndsen Offline
LVF-Team
LVF-Team

Beiträge: 2.437
Registriert seit: Feb 2005

8.2.1 - 2011
2004
DE

724xx
Deutschland
Reentrance
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

Geht nicht, gibts nicht!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
19.10.2006, 10:05
Beitrag #3

eg Offline
LVF-SeniorMod


Beiträge: 3.868
Registriert seit: Nov 2005

2016
2003
kA

66111
Deutschland
Reentrance
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

Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
19.10.2006, 17:00
Beitrag #4

Svenni Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 227
Registriert seit: Mar 2005

7.1, 8.0, 8.2, 8.21, 8.5, 8.6, 2009, 2010, 2011, 2012, 2013, 2014
2000
DE

23843
Deutschland
Reentrance
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
19.10.2006, 19:37
Beitrag #5

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
Reentrance
<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>

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!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
19.10.2006, 22:51
Beitrag #6

eg Offline
LVF-SeniorMod


Beiträge: 3.868
Registriert seit: Nov 2005

2016
2003
kA

66111
Deutschland
Reentrance
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

Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
19.10.2006, 23:26
Beitrag #7

eg Offline
LVF-SeniorMod


Beiträge: 3.868
Registriert seit: Nov 2005

2016
2003
kA

66111
Deutschland
Reentrance
Hier mein Beispiel zum besseren Verständnis.

   

Sonstige .vi  UserEvents.vi (Größe: 14,57 KB / Downloads: 182)


Gruss, Eugen


Angehängte Datei(en)
Sonstige .vi  UserEvents8.0.1.vi (Größe: 14,56 KB / Downloads: 157)

Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
20.10.2006, 07:47 (Dieser Beitrag wurde zuletzt bearbeitet: 20.10.2006 07:57 von jg.)
Beitrag #8

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
Reentrance
<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>

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!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
20.10.2006, 10:19
Beitrag #9

cb Offline
LVF-SeniorMod


Beiträge: 1.731
Registriert seit: Feb 2006

2018SP1
2001
EN

40xxx
Deutschland
Reentrance
' 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)
Sonstige .zip  mltithrd.zip (Größe: 74,43 KB / Downloads: 1594)


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

http://www.rotabench.com - rotierende Prüfstände nach dem Baukasten-Prinzip
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
20.10.2006, 16:06
Beitrag #10

eg Offline
LVF-SeniorMod


Beiträge: 3.868
Registriert seit: Nov 2005

2016
2003
kA

66111
Deutschland
Reentrance
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

Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Gehe zu: