18.10.2006, 22:20
Beitrag #1
|
eg
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
|
|
|
19.10.2006, 07:26
Beitrag #2
|
A.Berndsen
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
|
|
|
19.10.2006, 10:05
Beitrag #3
|
eg
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
|
|
|
19.10.2006, 17:00
Beitrag #4
|
Svenni
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
|
|
|
19.10.2006, 19:37
Beitrag #5
|
jg
CLA & CLED
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.
|
|
|
19.10.2006, 22:51
Beitrag #6
|
eg
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
|
|
|
19.10.2006, 23:26
Beitrag #7
|
|
|
20.10.2006, 07:47
(Dieser Beitrag wurde zuletzt bearbeitet: 20.10.2006 07:57 von jg.)
Beitrag #8
|
jg
CLA & CLED
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!! </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.
|
|
|
20.10.2006, 10:19
Beitrag #9
|
cb
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 gewartet (Glückwunsch und so ...)
Literatur: (leider in Englisch)
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
|
|
|
20.10.2006, 16:06
|
eg
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
|
|
|
| |