LabVIEWForum.de
Fehler 1 bei Element in Queue einfügen - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Fehler 1 bei Element in Queue einfügen (/Thread-Fehler-1-bei-Element-in-Queue-einfuegen)



Fehler 1 bei Element in Queue einfügen - s200rs - 18.03.2008 10:38

Hallo,

heute habe ich ein Problem mit einer Queue.

in einem Sub-VI lasse ich mir verschiedene Meldungen über eine Queue ausgeben, die vom aufrufenden VI ausgewertet werden.
Die Queue-Elemente bestehen aus einem Cluster aus einem Enum, das den Typ der Meldung klassifiziert (Meldung, Fehler, etc.) und einem String, der die Meldung enthält.

Interessanterweise funktioniert das ganze bis zur ersten Meldung einwandfrei. Alle weiteren Meldungen lösen bei "Element in Queue einfügen" den Fehler 1 "Ein Ausgabeparameter ist ungültig" aus.

Die Queue ist so initialisiert, daß die Anzahl der Elemente unbegrenzt ist. Mittlerweile verwende ich auch Timeouts beim Einfügen von Elementen und beim Entfernen aus der Queue - aber ohne Erfolg.

Kann sich jemand vorstellen, warum das nur beim allerersten Element klappt, aber danach nicht mehr?

Gruß Andreas


Fehler 1 bei Element in Queue einfügen - s200rs - 18.03.2008 13:48

Hallo nochmal,

also ich hab noch bißl rumgespielt und dabei etwas festgestellt, doch zuerst noch mal was zu meinem Algorithmus:
In meinem Haupt-VI initialisiere ich die Queue über "Queue anfordern". Die daraus erhaltene Queue (bzw. ist es ja eine Referenz) übergebe ich zum einen an eine Wiederholungsschleife, welche die Meldungen ausgeben soll, und zum anderen an mein Sub-VI als Übergabeparameter. Das Sub-VI wird über eine VI-Referenz geladen und ausgeführt.

In dem aufgerufenen Sub-VI greife ich direkt auf die übergebene Variable zu.

Die Widerholungsschleife liest alle Meldungen der Queue aus und verarbeitet sie weiter, so lange das Sub-VI läuft. Anschließend wird die Queue wieder freigegeben.

Wenn ich im Sub-VI vor dem ersten Aufruf von Queue-"Element einfügen" den Queue-Status abrufe, erhaltet ich als Queue-Namen den Namen, unter dem ich im aufrufenden VI die Queue auch angefordert habe. Lese ich den Status nochmal aus, nachdem die erste Meldung ausgegeben wurde, erhalte ich einen leeren String und Fehler bei bei Queue-Status lesen.

Hingegen erhalte ich beim ersten Lesen des Queue-Status und beim Einfügen des ersten Elements keine Fehlermeldung.

Es sieht so aus, als ob beim Schreiben des ersten Elements die Referenz zur Queue verlorengeht.

Weiterhin habe ich das ganze so ausprobiert, wie es in einem der Beispiele in LV8.5 dargestellt wird: Im Sub-VI wird die Queue mit dem gleichen Namen wie im aufrufenden VI erneut angefordert, dann damit gearbeitet und wieder freigegeben. Doch auch hier erhalte ich nur das erste Element.


Fehler 1 bei Element in Queue einfügen - StefanHH - 18.03.2008 14:22

' schrieb:...
Im Sub-VI wird die Queue mit dem gleichen Namen wie im aufrufenden VI erneut angefordert, dann damit gearbeitet und wieder freigegeben.

Hi,

es ist nur eine Vermutung, aber was meinst Du mit wieder freigegeben!? Könnte es sein, das du in deinem SubVI mit der Funktion "Release Queue" die Queue wieder freigeben willst...!? Damit würdest du sie näml. zerstören. Da gibt es nicht freizugeben, da der Zugriff niht geschützt ist. Für eine zusätzliche Synchronisation könnte man dann einen Mutex nutzen. Es reicht aus, die Queue einmal in deinem TopLevelVI zu erzeugen ("ObtainQueue") mit selbiger Funktion kannst du im SubVI die Referenz anfordern und aus der Queue lesen. Die Funktion "ReleaseQueue" führst du nur einmal bei der Deinitialisierung im TopLevelVI aus.

Gruß,
Stefan


Fehler 1 bei Element in Queue einfügen - s200rs - 18.03.2008 15:26

Hallo Stefan,

also, so wie ich's ursprünglich (und mittlerweile wieder) mache, ist so wie Du's beschrieben hast: also die Queue im Aufrufenden VI anfordern und dort auch wieder freigeben (wie bereits beschrieben, wenn die Ausführung des Sub-VIs abgeschlossen ist).

Ich hatte nur zwischenzeitlich ausprobiert, ob es besser funktioniert, wenn ich die Queue im Sub-VI anhand des Namens erneut anfordere (so wie es in einem der LV-Beispiele gemacht wird). Aber das hat auch nicht zum Erfolg geführt und deswegen hab ich das alles wieder rausgelöscht.

Und selbst wenn ich sie am Ende des Sub-VIs freigeben würde, macht das auch nichts, da die Vorgänge da drin estwas länger dauern, so das die Meldungen über das parallel laufende aufrufende VI schon abgeholt worden sind. Nein, ich bekomme ja die Fehlermeldungen noch während das Sub-VI ausgeführt wird. Und mit jedem Abschnitt (ist 'ne Zustandsmaschine) wieder.

Das funktioniert im Prinzip so: Sub-VI gestartet -> in ersten Wiederholungschleifendurchlauf -> Queue-Status abrufen --> Ergebenis: Queue-Name stimmt, kein Fehler -> in einen Case rein, abarbeiten abhängig vom Ergebnis nächsten Case festlegen und entsprechendes Element in Queue einfügen --> Ergebnis: kein Fehler -> nächster Schleifendurchlauf: Queue-Status auslesen --> Ergebnis, Kein Name, Fehlermeldung Fehler 1 -> in vorhger gewählten Case rein, abarbeiten, Ergebnis in Queue einfügen --> Ergbenis: wieder Fehler 1 und immer so weiter bis ich einen Endstatus erreicht habe.

Also immer nachdem das erste Element übergeben wurde geht nichts mehr.

Vielleicht geh ich ja auch falsch ran, daß es mit der Queue-Referenz als Übergabe-Parameter an ein Sub-VI nicht funktioniert. Das würde mich allerdings wundern, denn auf die Art und Weise mach ich das schon seit 3 Jahren mit LV7.1 und dort hatte ich keine Probleme dieser Art.