LabVIEWForum.de - Problem aufruf SubVI mittels Referenz

LabVIEWForum.de

Normale Version: Problem aufruf SubVI mittels Referenz
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen

Ich habe für ein grösseres Programm etwas gesucht um eine nicht konstante Anzahl offener Instanzen eines SubVIs laufen zu lassen.

Bin nun auf die Ablaufinvarianten VIs gestossen und will den Datenverkehr über Queues regeln.

Hier besteht ein Problem, ich habe hierzu ein kleines Beispiel das nur ein SubVI starten soll kreiiert, das Problem scheint auch im kleinen Massstab existent, ich wäre froh, wenn sich jemand mein Beispiel ansehen und mir sagen könnte ob ich etwas grundlegendes falsch mache.

Das main-VI schreibt eine Zufallszahl in eine Queue (q1) danach soll das SubVI aufgerufen werden, welches den Wert aus q1 nach q2 umlädt. Schliesslich soll im Main-VI q2 ausgelesen werden.
Wenn das SubVI einfach als Block eingebaut wird funktioniert es, es muss also etwas mit der Referenzierung nicht in Ordnung sein.

Besten Dank und freundliche Grüsse

Andreasser
...LV Version 8.5.1
' schrieb:Das main-VI schreibt eine Zufallszahl in eine Queue (q1) danach soll das SubVI aufgerufen werden, welches den Wert aus q1 nach q2 umlädt. Schliesslich soll im Main-VI q2 ausgelesen werden.
Eigentlich sollte das alles so richtig sein. Beachte aber, dass zu jedem "Queue anfordern" ein "Queue freigeben" vorhanden sein muss.

Zitat:Wenn das SubVI einfach als Block eingebaut wird funktioniert es, es muss also etwas mit der Referenzierung nicht in Ordnung sein.
Also ich finde ja, du hast alles richtig gemacht. Allerdings funktioniert dein Programm tatsächlich nicht. Warum, kann ich mir jetzt nicht erklären.

Ich muss allerdings dazu sagen, ich selbst mach das nie so. Ich hab eine FGV, in der die Queue erstellt und gelöscht wird. Wer die Queue braucht, holt sich die Referenz der Queue aus der FGV. Und siehe da, auch dein Muster geht dann wieder.
Du machst zwei Fehler in deiner Testapplikation. Ersten wartest du bis das Sub VI fertig ist. Da du aber danach das Sub VI stoppst, wird die Queue Referenz gelöscht und du erzeugst im Main VI eine neue Queue mit dem Namen q2 ohne Inhalt. Und, wenn ich mich nicht irre, ist eine Queue nur innerhalb eines Projekts in unterschiedlichen Instanzen verfügbar.

Gruß, abrissbirne
Wow, super!


@IchSelbst: Danke für deinen Input, ist auch ne gute Möglichkeit, werd ich mir für die Zukunft merken. (die "Queue freigeben" habe ich im grossen Proggi drinWink

@abrissbirne:Ich bin gestern schier verzweifelt, hab alles hundert mal durchgedacht und bin trotzdem nicht drauf gekommen aber wenn du das so sagst ist es mehr als einleuchtend.

Funktioniert jetzt tadellos auch im grösseren Programm

Danke euch beiden!
' schrieb:und du erzeugst im Main VI eine neue Queue mit dem Namen q2 ohne Inhalt
Warum aber funktioniert dann die Queue Q1? Damit der Queue-Inhalt trotz Freigeben der Queue-Referenz nicht verloren geht, gibt es ja den Eingang "Eliminieren (f)", der standardmäßig auf false steht.
' schrieb:(die "Queue freigeben" habe ich im grossen Proggi drinWink
Das zählt nicht (naja, zumindest bei mir nicht)!

Zu jeden einzelnen "Queue anfordern" muss ein "Queue freigeben" vorhanden sein. Wenn du also sieben Elemente "Queue anfordern" hast, brauchst du auch sieben "Queue freigeben". Guckst du auch Hilfe:

Zitat:Mit der Funktion Queue anfordern kann eine Referenz auf eine bestimmte Queue mehrfach abgerufen werden. Um eine Queue zu eliminieren, ist entweder die Funktion "Queue freigeben" so oft aufzurufen, wie die Queue angefordert wurde, oder es sind alle VIs abzubrechen, in denen die Queue-Refnum verwendet wird.

Zwar wird die Referenz auch beim Beenden eines VIs automatisch gelöscht (guckst du Hilfe) - das ist aber kein guter Programmierstil. Möglicherweise wird der Queue-Inhalt deswegen gelöscht, weil das VI über den VI-Server (also per Referenz) aufgerufen wird.

Nachtrag:
Es kann natürlich sein, dass eine Queue grundsätzlich eliminiert wird, wenn keine einzige Referenz mehr besteht - obwohl noch Daten in der Queue liegen. Das wäre aber ein grenzwertiges Feature.
' schrieb:Warum aber funktioniert dann die Queue Q1?
Stimmt, Punkt zwei sollte also funktionieren.

' schrieb:Damit der Queue-Inhalt trotz Freigeben der Queue-Referenz nicht verloren geht, gibt es ja den Eingang "Eliminieren (f)", der standardmäßig auf false steht.
LV Hilfe sagt das: "Diese Bytes werden automatisch beim Stopp des VIs freigegeben."
Referenz-URLs