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!
03.03.2011, 17:08 (Dieser Beitrag wurde zuletzt bearbeitet: 03.03.2011 17:09 von GerdW.)
RE: Zu SCHNELLES Auslesen einer Queue-Funktion ???
Hallo Sternhagel,
wenn eine Funktion einen Wert zurückgibt ("returns"), dann immer zum Aufrufenden und nie zur Daten-Quelle!
Du rufst eine Funktion auf und sie gibt dir einen Wert zurück. Wenn du eine Addition aufrufst, willst doch du das Ergenis haben und nicht einer der Summanden...
RE: Zu SCHNELLES Auslesen einer Queue-Funktion ???
Ich habe meine Lösung so gewählt, weil ich in der Auswerteschleife unter umständen einfach nicht warten will bis ein neuer Wert in der Queue ankommt.
Ich sollte dazu sagen, dass die Werte Positionsangaben sind. Und die Position ändert sich von einem Wert zu anderen nicht so dramatisch als das ich nicht auch den davor ausgelesenen Wert benutzen könnte, wenn gerade kein ganz aktueller da ist.
Mit meiner Lösung bin ich damit nicht von der Ausführgeschwindigkeit der sendenden Schleife abhängig, was mir bei zwei voneinander total unabhängiger While-Schleifen wichtig ist.
Aber ich verstehe natürlich euere Argumente. So ganz steht mein Program auch noch gar nicht, und je nachdem werde ich zum Schluss dann eher eure oder eher meine Lösung auswählen :-)
(03.03.2011 17:08 )GerdW schrieb: wenn eine Funktion einen Wert zurückgibt ("returns"), dann immer zum Aufrufenden und nie zur Daten-Quelle!
Du rufst eine Funktion auf und sie gibt dir einen Wert zurück. Wenn du eine Addition aufrufst, willst doch du das Ergenis haben und nicht einer der Summanden...
Wie kann mir den die Funktion etwas an mich ZURÜCKGEBEN, dass ich noch niemals hatte ;-)
Sie kann mir von mir aus etwas ÜBERGEBEN aber nicht ZURÜCK-geben!
Ich will damit nicht sagen, dass du unrecht hast, aber das hier ist einer dieser typischen Fälle, in denen die fachspezifische Nomenklatur nicht der "üblicherweise verwendeten Ausdrucksweise" entspricht... darum auch meine Fehlübersetzung! :-)
Ich hatte im Studium ja auch mal programmieren auf dem Stundenplan... wahrscheinlich hätte ich das damals auch anders "übersetzt" :-)
RE: Zu SCHNELLES Auslesen einer Queue-Funktion ???
(03.03.2011 17:14 )Sternhagel schrieb: Ich habe meine Lösung so gewählt, weil ich in der Auswerteschleife unter umständen einfach nicht warten will bis ein neuer Wert in der Queue ankommt.
Ich sollte dazu sagen, dass die Werte Positionsangaben sind. Und die Position ändert sich von einem Wert zu anderen nicht so dramatisch als das ich nicht auch den davor ausgelesenen Wert benutzen könnte, wenn gerade kein ganz aktueller da ist.
Mit meiner Lösung bin ich damit nicht von der Ausführgeschwindigkeit der sendenden Schleife abhängig, was mir bei zwei voneinander total unabhängiger While-Schleifen wichtig ist.
Aber ich verstehe natürlich euere Argumente. So ganz steht mein Program auch noch gar nicht, und je nachdem werde ich zum Schluss dann eher eure oder eher meine Lösung auswählen :-)
Ähm ja, aber in deinen Screenshots in Beitrag #7 hast du parallel zum Dequeue ein Wait von 20 ms programmiert.
Was ist jetzt, wenn du mit 10 ms Werte in die Queue schreibst? Dann kommst du gar nicht mehr mit, und irgendwann läuft dir der Speicher über!
Besser: Am Eingang von Dequeue eine 20 anschließen. Dann passiert nämlich folgendes: Ist die Queue nicht leer, bekommst du sofort einen Wert zurückgegeben, und wenn sie gerade leer ist, dann wird max. 20 ms gewartet, danach wird die Funktion mit einem Timeout beendet.
Gruß, Jens
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!
RE: Zu SCHNELLES Auslesen einer Queue-Funktion ???
Hmmm... also die Auswerteschleife soll unabhängig von der Ausleseschleife laufen. Darum habe ich diese 20ms programmiert, um unterschiedlich schnelle Auswertevorgänge zu simulieren.
Das Problem ist, wenn ich es so mache wie du vorschlägst, dass, wenn das eingestellte Timeout irgendwann den Auslesevorgang abbricht, die Dequeue-Funktion mir doch eine Null liefert oder? Und mit der Null kann ich eben in der darauf folgenden Auswertung nix anfangen... darum wollte ich dann wenigstens den alten Wert haben.
RE: Zu SCHNELLES Auslesen einer Queue-Funktion ???
Natürlich sollst du im Timed-Out Fall wieder die Fallunterscheidung machen, also entweder gar keinen neuen Wert oder den letzten.
Aber in deinem Bsp kann es bei zu schnellem Schreiben in die Queue passieren, dass du gar nicht mehr mit dem Auslesen nach kommst, zwecks dem festen Takt von 20 ms.
Gruß, Jens
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!
RE: Zu SCHNELLES Auslesen einer Queue-Funktion ???
Bin nicht sicher, ob ich dich verstanden habe :-)
Also ich muss auch nicht jeden einzelnen Wert unbedingt auslesen. Nur immer jeweils den aktuellsten sobald meine Auswerteschleife "fertig ausgewertet" hat.
Wenn der Auswerteprozess nun sehr lange dauert, dann ist klar, dass ich nicht jeden einzelnen Wert der Ausleseschleife auch tatsächlich auslese... aber das ist auch nicht weiter schlimm!
Die Queue wird im übrigen auf maximal einen Wert begrenzt.
Anzeige
03.03.2011, 22:50 (Dieser Beitrag wurde zuletzt bearbeitet: 03.03.2011 22:55 von GerdW.)
RE: Zu SCHNELLES Auslesen einer Queue-Funktion ???
Hallo Sternhagel,
Zitat:Also ich muss auch nicht jeden einzelnen Wert unbedingt auslesen. Nur immer jeweils den aktuellsten sobald meine Auswerteschleife "fertig ausgewertet" hat.
Dann nimm entweder Notifier und eine Queue mit einer Länge von 1 Element zusammen mit LossyEnqueue...
(Das bisher gesagte zur Nutzung von TimeOut und Auswertung des TimedOut?-Ausgangs bleibt aber weiterhin gültig!)
Zitat:Wie kann mir den die Funktion etwas an mich ZURÜCKGEBEN, dass ich noch niemals hatte ;-)
Ich weiß ja nicht, wo und wann du das erste mal was zu "Programmierung" gehört hast, aber das "Funktionen" "Rückgabewerte" liefern, hatte ich schon vor längerer Zeit mitgeteilt bekommen... Manche Programmiersprachen unterscheiden zwischen Funktionen und Prozeduren: die einen liefern Rückgabewerte, die anderen nicht.
RE: Zu SCHNELLES Auslesen einer Queue-Funktion ???
Wenn du im Prinzip alle Funktionen die eine Queue hat nicht nutzen möchtest (kein Timeout, dadurch kein sofortiges Auslesen wenn ein Wert hereinkommt; es nicht wichtig ist das jedes Element ausgelesen wird bei der Auswertung etc.), dann würde für deine Anwendung doch eigentlich eine Lokale Variable viel mehr Sinn machen in die du in der Ausleseschleife schreibst und in der Auswerteschleife aus diese ausliest.
Dir sind die entstehenden Racing conditions ja eh schnurz, da du weder jeden Wert lesen musst (zwingend), noch für dich unbedingt wichtig ist nur bei Wertänderungen (ergo auch wenn der gleiche Wert nochmal neu eingelesen würde) explizit zu erkennen das der geändert wurde. Eine Queue ist da doch nur unnötiger Aufwand....
Zitat:Märchen und Geschichten werden erzählt am Lagerfeuer, technischen Fakten werden mitgeteilt (oder so). (Genauso wie Software nicht auf einem Server "herumliegt", die ist dort installiert.)
RE: Zu SCHNELLES Auslesen einer Queue-Funktion ???
Da würde ich auf diesen Post verweisen. Da ist mal (eventuell nicht representativ aber als obere Abschätzung sicher brauchbar) eine Messung der Ausführungszeit vorgenommen (für 200.000 Transfers) - entsprechend sollte gegenüber deinen kritischen Ausführungszeiten im ms Bereich die der LV keine Rolle spielen (du benutzt ja nur eine). Laut der Messung wäre sie auch schneller als die Queue von daher würde dein Programm schneller.
Kannsts ja einfach mal selbst austesten - mit beiden Varianten den Zeitbedarf für 100.000 ungebremste Durchläufe deines Programms messen oder so ^^
Zitat:Märchen und Geschichten werden erzählt am Lagerfeuer, technischen Fakten werden mitgeteilt (oder so). (Genauso wie Software nicht auf einem Server "herumliegt", die ist dort installiert.)