LabVIEWForum.de
Letztes Element einer Queue ist immer Null - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: Datenbank & File IO (/Forum-Datenbank-File-IO)
+---- Thema: Letztes Element einer Queue ist immer Null (/Thread-Letztes-Element-einer-Queue-ist-immer-Null)



Letztes Element einer Queue ist immer Null - tron - 23.10.2008 10:31

Hallo Experten,

Ich benutze eine Queue um Steuerdaten für eine Heizrampe in mein Hauptprogramm einzufüttern. Ein Sub-VI erstellt diese Queue mit einem Element pro Sekunde und das Haupt-VI liest diese Queue dann im Sekundentakt ein. Das funktioniert auch alles soweit.

Ich benutze zum Auslesen die Funktion "Dequeue Element". Wenn die Warteschlange leer ist, dann soll das Programm mit dem letzten Wert der Queue weiterlaufen. Leider tut es das nicht, ich muß den Timeout des "Dequeue Element" auf >1 setzen, ansonsten hängt das Programm, was ja auch zu erwarten ist, weil es auf den nächsten Wert der Queue wartet. Leider ist im Fall des Timeout dann das letzte Element, das die Queue verläßt, Null.

Genau da brauche ich dann den letzten Wert der Queue. Ich habe es mit einem "Preview Element" versucht, laufe da aber auch wieder in das Problem des Timeout.

Gruß,
Michael


Letztes Element einer Queue ist immer Null - Achim - 23.10.2008 10:40

Naja du könntest dir immer das gerade entnommene Element in ein Schieberegister schreiben...und mit "Get Queue Status" guckst du, wieviele Elemente noch in der Queue sind...wenn das "Null" sind, nimmst du das zuletzt ins Schieberegister geschobene Element ...wenn nicht, führst du "Dequeue Element" aus und schreibst dieses Element ins Schieberegister!


Letztes Element einer Queue ist immer Null - eg - 23.10.2008 10:43

Du kannst das letzte Element in die Queue nach dem Auslesen wieder reinschreiben, dann brauchst du keinen Timeout.


Letztes Element einer Queue ist immer Null - tron - 23.10.2008 13:15

Hi Leute,

danke für die Anregungen, das mit dem Schieberegister muß ich mal probieren.


Letztes Element einer Queue ist immer Null - Lucki - 23.10.2008 14:28

Du mußt den Timeout=0 setzen und den Boolschen Ausgang abfragen, ob Timeout überschritten wurde.
Timeout nicht überschritten: es war zum Zeitpunkt der Abfrage mindestens ein Element in der Queue, alles ist OK.
Timeout überschritten: Es war zum Zeitpunkt der Abfrage kein Element in der Queue. Dann nimmst Du das vorhergehende Element aus dem Schieberegister. so wie vorgeschagen

Der Timeout = 0 muß angeschlossen werden, wenn auf das Kommen neuer Werte kein Verlass ist. Ohne Anschluß ist der Timeout -1 = unendlich und das kann zur Blockade führen.

Der Vorschlag von EG funktioniert so nicht, denn zum Zeitpunkt des Auslesens aus der Queue weißt Du ja noch nicht, ob bei der nächten Abfrage das reguläre nächste Element in der Queue ist oder nicht. Wenn ja, dann war das eingeschriebene Element überflüssig wie ein Kropf umd macht Probleme. Natürlich wäre das mit irgendeiner verqueren Logk alles wieder zurechtzubiegen, aber wozu der Aufwand.


Letztes Element einer Queue ist immer Null - eg - 23.10.2008 14:38

Sorry, mein Vorschlag bezog sich auf Timeout = -1, warum soll es nicht funktionieren?


Letztes Element einer Queue ist immer Null - Lucki - 23.10.2008 15:20

Hier noch das Beispiel zum Beitrag:
[attachment=14997]
[attachment=14996]
@Eugen modifiziere doch einfach mal mein Beispiel so, daß es mit timout -1 funktioniert, dann sehen wir weiter.


Letztes Element einer Queue ist immer Null - eg - 23.10.2008 15:31

Ja, warum geht es eigentlich so nicht?


Letztes Element einer Queue ist immer Null - Lucki - 23.10.2008 16:13

' schrieb:Ja, warum geht es eigentlich so nicht?
Natürlich geht es so, genau so macht man es normalerweise. Es erfüllt nur nicht die Bedingung der Anfrage, die da lautet:
Zitat:Wenn die Warteschlange leer ist, ...
dann soll nicht auf das nächste eintreffende Element gewartet werden, sondern
Zitat:...dann soll das Programm mit dem letzten Wert der Queue weiterlaufen.

Gruß Ludwig


Letztes Element einer Queue ist immer Null - eg - 23.10.2008 16:46

Ok, habe jetzt so gemacht:

wenn mehr als 1 Element in der Queue, dann lesen
ansonsten nur Preview

Also doch ohne Schieberegister, das letzte Element bleibt einfach in der Queue.

Die Timeouts sind trotzdem überall -1Big Grin

Lv80_img[attachment=15001]