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!
Ich möchte in zwei parallelen Schleifen Daten erfassen (1) und Daten abspeichern (2). In (1) werden z.B. alle 1000ms Daten erfasst und in eine Queue gegeben (nicht ganz so auf diese Art, (1) soll nur ein Beispiel für das Einfügen in die Queue sein).
Meine Frage nun - was macht die Schleife Daten schreiben (2)? Pollt die Schleife, solange bis ein Element in der Queue ist bzw. wartet sie, bis ein Element an der Funktion Element aus Warteschlange holen ankommt (time-out dieser Funktion will ich nicht berücksichtigen)?
Oder gibt es "bessere" Lösungen als diese?
Anzeige
30.01.2013, 11:24 (Dieser Beitrag wurde zuletzt bearbeitet: 30.01.2013 11:26 von Trinitatis.)
deine Queue-Ausleseschleife wartet solange, bis ein Element in der Queue steht, oder ihr Tineout abgelaufen ist. Den würde ich in den meisten Fällen setzen, da sich dein VI sonst aufhängen könnte.
Gruß, Marko
Edit:
nur zur Präzision: Die Queue-Lesefunktion pollt nicht in dem Sinne, wie das eine Schleife täte - belastet also nicht den Prozessor!
Du schreibst:
"... deine Queue-Ausleseschleife wartet solange, bis ein Element in der Queue steht, oder ihr Tineout abgelaufen ist. Den würde ich in den meisten Fällen setzen, da sich dein VI sonst aufhängen könnte. ..."
Meine eigentlich Umsetzung sieht bisher so aus, dass ich eine while-Schleife habe, die alle 5 sec. ausgelöst wird, dann ein Case der checkt, ob Elemente in der Warteschlange sind und dann alle Elemente in einer weiteren while-Schleife in die Datei schreibt. Dann hab ich in der Funktion Element aus Queue holen ein timeout-Wert gesetzt und die andere Seite mit dem Stopp-Button verbunden.
Das Problem war erstmal nur, dass ich mir nicht sicher war, was die while-Schleife in meinem ersten Fall macht, darum hatte ich ein etwas abstrahiertes Bild zugesendet, um meine Frage etwas besser zu verdeutlichen.
30.01.2013, 12:00 (Dieser Beitrag wurde zuletzt bearbeitet: 30.01.2013 12:02 von Trinitatis.)
Ich würde schonmal das ständige Öffnen/schließen der Datei lassen. Datei einmal öffnen und dann in die Queue-Lesefunktion gehen. So kannst du dir auch deinen festen Wait von 5s sparen - die Queue-Lesefunktion wartet sowieso. Dann prüftst du den Ausgang, ob der TO angeschlagen hat und schreibst in die Datei, wenn nicht. Ansonsten machste nix.
Die beiden Schleifen synchronisieren sich dann von ganz allein.
Gruß, Marko
Edit:
Wenn du dann mit allem fertig bist - Datei wieder schließen!
(30.01.2013 12:00 )Trinitatis schrieb: Ich würde schonmal das ständige Öffnen/schließen der Datei lassen.
...
Wenn du dann mit allem fertig bist - Datei wieder schließen!
Mich nerven zwar auch manchmal die elementaren Fragen von hasenfuß, aber diesmal hat er doch Vieles richtig gemacht. Das VI ist ja alles andere als funktionsfähig. Es sind auch die Stops in den Schleifen nicht angeschlossen, und in die Queue werden keine Daten eingegeben. Zur Illustration seiner Frage ist das jedoch ausreichend. Man kann ihm also unterstellen, dass er das mit dem Öffnen und Schließen der Dateien im "Ernstfall" richtig gemacht hätte.
Man sieht hier immer wieder bei Anfängern, dass in die Schleife zum Auslesen der Queue ein Wait reingemacht wird. Auch das wurde hier richtig gemacht. Im umgekehrten Fall würde sich die Queue (wenn die Datenrate nicht beschränkt ist) blitzartig füllen, es würden nicht aktuelle Daten aus der Vergangenhat ausgelesen. Oder noch besser: Wenn keine Queue-Länge angegeben ist (default), dann füllt sich die Queue, bis das Programm abstürzt.
Hasenfuss prüft in seiner Schleife mit der Case-Anweisung "1.." , ob in der Queue Daten vorhanden sind mit einer Wartezeit von 5s. Wenn welche da sind, dann springt er in den Verarbeitungszweig. In dieser Form ist ein Wait natürlich zwingend, da die Queue-Abfrage in den Fällen wo nix drinnen steht entsprechend schnell pollen würde.
Ich hatte aber vorgeschlagen, gleich in die Queue-Lesefunktion zu gehen, die ja auch das Flag TO überschritten angibt und somit auch ausgibt, ob die Queue Daten enthält, diese dann aber auch gleich ausgibt, do dass er sie weiterverarbeiten (speichern) könnte. In diesem (neuen) von mir skizzierten Fall könnte er sich dann die 5s Wartezeit sparen.
D.h. Hasenfuß könnte doch die Funktion Queue-Status lesen durch die Funktion Queue-Element auslesen ersetzen und seine Case-Struktur vom Flag TO überschritten abhängig machen. Dann könnte er in dem Case seine Datenspeicherung machen und sollte dort dann auch nicht die Datei jedesmal öffnen/schließen.
Oder habe ich komplett falsch verstanden, was er da vorhat?!
@trinitatis
Vergiß alles, was ich gesagt habe. Ich hatte nur den ersten Beitrag von Hasenfuß gesehen und hatte mich ausschließlich darauf bezogen. Da Du Dich auf den aktuellen zweiten Beitrag bezogest, mussten wir aneinander vorbeireden.
Ich habe eine Frage zu der Funktion "Element aus Queue holen", die ich leider nicht aus der Hilfe beantworten konnte.
Die Funktion liefert ein timeout = true, wenn die Wartezeit überschritten wurde. Die Zeit kann ich einstellen, wird nichts definiert, hat die Wartezeit den Wert -1. Was passiert beim timeout-Wert von -1? Funktioniert der timeout von "Element aus Queue holen" dann wie eine Anzeige, die sofort reagiert?
Marko schrieb:
" ... Ich hatte aber vorgeschlagen, gleich in die Queue-Lesefunktion zu gehen, die ja auch das Flag TO überschritten angibt und somit auch ausgibt, ob die Queue Daten enthält, diese dann aber auch gleich ausgibt, do dass er sie weiterverarbeiten (speichern) könnte. In diesem (neuen) von mir skizzierten Fall könnte er sich dann die 5s Wartezeit sparen. ..."
Ich habe das jetzt so versucht umzusetzen wie in dem Bild hier - bin in einer while-Schleife. Wenn timeout = false, dann wird derl false-case aktiviert und das Element rausgelesen. Wenn aber ein timeout ausgelöst wird - hier in diesem Fall einfach mal nach 500ms, dann passiert erstmal nichts weiter, nur der true-case wird ausgeführt, danach ist die while-Schleife aber wieder aktiv - ich interpretiere dass jetzt so, dass das timeout mit 500ms verknüpft mit dem case der Warten-Funktion entspricht.
Aber ich bin mir immer noch unschlüssig, was passiert, wenn der timeout-Anschluss immer noch false liefert, aber noch kein Element da ist und es z.B. noch 400ms bis zum umsetzen auf true Zeit braucht? Dann würde in dieser Zeit ja der false-case ausgelöst werden, obwohl auch noch kein Element da ist.
01.02.2013, 10:17 (Dieser Beitrag wurde zuletzt bearbeitet: 01.02.2013 10:19 von GerdW.)
Zitat:Timeout in ms gibt an, wie lange die Funktion bei leerer Queue darauf warten soll, dass ein Element in der Queue verfügbar wird. Die Voreinstellung lautet –1 (kein Zeitlimit).
Wenn die Funktion für die Dauer von Timeout in ms gewartet hat und die Queue immer noch leer ist, wird Timeout? TRUE.
Wie lange wartet die Funktion also bei einem TimeOut von "-1"?
Zitat:wenn der timeout-Anschluss immer noch false liefert, aber noch kein Element da ist
???
Entweder "TimeOut=TRUE, weil kein Element da" oder "TimeOut=False, weil Element da"...