INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Pausieren von parallel ablaufenden Producer/Consumer Schleifen



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!

16.06.2010, 10:05
Beitrag #1

Aleph1 Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 51
Registriert seit: Sep 2005

7.1 + 8.6.1
2005
de_en

69120
Deutschland
Pausieren von parallel ablaufenden Producer/Consumer Schleifen
Hallo miteinander,
in den nächsten Tagen werde ich mit einem Producer/Consumer-Projekt beginne und plane gerade meine Programmstruktur mittels Multicoreprozessor.
Folgendes wird prgrammiert:
Über Prozessor 1 nehme ich Daten auf, die ich in eine Queue schreiben werde (werden große Datenmengen)
Prozessor 2 muss diese Daten zwischenverarbeiten
Prozessor 3 soll für die abspeicherung in Binärfiles zuständig sein.
Dafür möchte ich 3 parallel ablaufende Timed-loops verwenden, um die unterschiedlichen Prozessorkerne verwenden zu können.

Die Messungen sollen dabei ohne personelle Überwachung prakatisch beliebig lange ablaufen können (über Nacht ist standard).
Jetzt sehe ich ein Problem auf mich zukommen:
Tendenziell kann Prozessor 1 schneller Daten aufnehmen, als Prozessor 2 verarbeiten kann - zumindest ist das im Bereich des Möglichen - und damit kann über lange Zeiträume gesehen die Queue langsam vollaufen. Genau das möchte ich nun vermeiden und hier kommt nun meine Frage:
Wie schaffe ich es, abhängig von der Anzahl der Queueelemente bzw. Speicherbelegung der Queue (in MB) , Prozess 1 (Datenaufnahme) pausieren zu lassen so dass Prozess 2 erstmal die Daten weiter verarbeiten kann? Ich würde auch, sobald die Pause-Bedingung eintritt, solange warten wollen, bis Prozess 2 die Queue vollständig abgearbeitet hat. Das ganze am besten ohne lokale Variablen oder an ähnlichen Quatsch. Ich will das richtig sauber programmieren.
Leider hab ich noch keine Codefragmente erstellt und kann daher nix mit anhängen.
Hat jemand eine Idee? Sehe ich den Wald vor lauter Bäumen nicht?

Dank und Gruß
Karl
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.06.2010, 10:09 (Dieser Beitrag wurde zuletzt bearbeitet: 16.06.2010 10:10 von chrissyPu.)
Beitrag #2

chrissyPu Offline
LVF-Stammgast
***


Beiträge: 467
Registriert seit: Jun 2006

2014 PDS
2006
DE_EN

64283
Deutschland
Pausieren von parallel ablaufenden Producer/Consumer Schleifen
Hi,

so mal in den Raum gesagt: Schleife für Prozessor 1 mit einer 3-State-Machine ausstatten: 1. State Queue testen, wie voll sie ist, 2. Wait, 3. Daten aufnehmen. In STate 1 entscheidest Du entweder, ob du wartest oder ob du in den Daten aufnehmen-Case gehst, Wait springt immer in den Testen-Case und Daten aufnehmen nimmt immer nur feste Paketgrößen auf udn springt danach wieder in Case 1...

ch
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.06.2010, 10:19 (Dieser Beitrag wurde zuletzt bearbeitet: 16.06.2010 10:44 von dimitri84.)
Beitrag #3

dimitri84 Offline
Astronaut
*****


Beiträge: 1.496
Registriert seit: Aug 2009

2020 Developer Suite
2009
DE_EN

53562
Deutschland
Pausieren von parallel ablaufenden Producer/Consumer Schleifen
' schrieb:so mal in den Raum gesagt: Schleife für Prozessor 1 mit einer 3-State-Machine ausstatten: 1. State Queue testen, wie voll sie ist, 2. Wait,
Nicht, dass sich die Daten auf diese Weise dann plötzlich im FIFO Puffer der Karte stauen, anstatt in der Queue. Da wäre dann der Queue Puffer die deutlich bessere Alternative, da um Welten größer ...

An Aleph1: Mach erstmal dein Programm so wie du es vorhast. Dann sehen wir ob sich was staut oder nicht. Prinzipiell hört sich dein Konzept sehr gut an.

Edit: Ich bin jetzt mal von Hardwaretakt ausgegangen, weil von großen Datenmengen die Rede ist ...

„Sag nicht alles, was du weißt, aber wisse immer, was du sagst.“ (Matthias Claudius)
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.06.2010, 10:49
Beitrag #4

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.697
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Pausieren von parallel ablaufenden Producer/Consumer Schleifen
' schrieb:Wie schaffe ich es, abhängig von der ... Speicherbelegung der Queue ... , Prozess 1 (Datenaufnahme) pausieren zu lassen so dass Prozess 2 erstmal die Daten weiter verarbeiten kann?
Genau so: Kucken, wie viele Elemente in der Queue noch Platz haben (oder schon drinnen sind) ...

' schrieb:Edit: Ich bin jetzt mal von Hardwaretakt ausgegangen, weil von großen Datenmengen die Rede ist ...
Pausieren (siehe oben) im Sinne des Anwenders würde dann heißen, dass der Hardwarepuffer zwar ausgelesen wird - aber nicht per Queue verschickt.

Solange das Problem besteht, dass die Messwerterfassung über Zeit gesehen schneller geht als deren Verarbeitung (wie auch immer: ob zwischenverarbeitet und dann gespeichert oder gestreamt gespeichert), muss man immer mit Verlust in Prozess 1 rechnen - sprich pausieren.

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.06.2010, 10:55 (Dieser Beitrag wurde zuletzt bearbeitet: 16.06.2010 10:59 von dimitri84.)
Beitrag #5

dimitri84 Offline
Astronaut
*****


Beiträge: 1.496
Registriert seit: Aug 2009

2020 Developer Suite
2009
DE_EN

53562
Deutschland
Pausieren von parallel ablaufenden Producer/Consumer Schleifen
' schrieb:Pausieren (siehe oben) im Sinne des Anwenders würde dann heißen, dass der Hardwarepuffer zwar ausgelesen wird - aber nicht per Queue verschickt.
Aha, und wo warten dann die ausgelesenen Daten in der Pause? Auf dem Pausenhof und essen ihr Pausenbrot? Sprich noch ein Puffer?

Ohne ein Programm finde ich es etwas früh darüber zu spekulieren ob die Verarbeitung zu lange dauert, zumal soviele Kerne im Spiel sind.

„Sag nicht alles, was du weißt, aber wisse immer, was du sagst.“ (Matthias Claudius)
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.06.2010, 11:22
Beitrag #6

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.697
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Pausieren von parallel ablaufenden Producer/Consumer Schleifen
' schrieb:Aha, und wo warten dann die ausgelesenen Daten in der Pause? Auf dem Pausenhof und essen ihr Pausenbrot? Sprich noch ein Puffer?
Die warten nicht, die gehen verloren ...

Zitat:darüber zu spekulieren ob die Verarbeitung zu lange dauert
Meine Überlegungen beziehen sich nicht auf ein Ob, sondern auf ein Dass.

Da fällt mir gerade ein:
Auch wenn die Prozesskette zu langsam ist, muss sich Prozess 1 eigentlich um gar nichts kümmern: Einfach in die Queue reinschreiben. Wenn die Queue bereits voll ist, wird der letzte Puffer einfach ignoriert und geht automatisch verloren.

Pausieren kann natürlich auch heißen, die Messwertgenerierung zu stoppen. Das geht dann natürlich wieder wie bei chrissyPu.

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
16.06.2010, 13:07 (Dieser Beitrag wurde zuletzt bearbeitet: 16.06.2010 13:10 von Lucki.)
Beitrag #7

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
Pausieren von parallel ablaufenden Producer/Consumer Schleifen
' schrieb:Da fällt mir gerade ein:
Auch wenn die Prozesskette zu langsam ist, muss sich Prozess 1 eigentlich um gar nichts kümmern: Einfach in die Queue reinschreiben. Wenn die Queue bereits voll ist, wird der letzte Puffer einfach ignoriert und geht automatisch verloren.
Ich wollte gerade etwas Ähnliches schreiben, aber IchSelbst gab bereits die ultimative Antwort - alles weitere Diskutieren ist damit überflüssig. Nur kleine Ergänzung: "Automatisch" geht nichts verloren. Man muß zum Reinschreiben schon die Funktion "Element einfügen (verlustbehaftet)" verwenden und nicht die ansonsten übliche Funktion "Element einfügen" Die erstgenannte Funktion gibt es erst seit kurzem, also vielleicht ab V8.6. - Es könnte auch Sinn machen, wenn die Daten einen Zeitstempel tragen, damit man merkt, wenn in der ansonten äquidistanten Folge Werte fehlen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.06.2010, 13:19
Beitrag #8

Aleph1 Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 51
Registriert seit: Sep 2005

7.1 + 8.6.1
2005
de_en

69120
Deutschland
Pausieren von parallel ablaufenden Producer/Consumer Schleifen
Hallo miteinander,
danke euch schon mal für eure guten Vorschläge.
Was mit den Daten in der eventuellen Pause geschieht, soll mir grad mal egal sein.
Man könnte ja auch, je nach gewünschtem Anwendungszweck Optionen schalten

Messkarte auslesen und neue Daten wegwerfen bis Queue leer
oder
Neue Messdaten als letztes Element in die Queue schreiben und den letzten Wert verlieren.

Aber das soll mich jetzt mal nicht kümmern.
In so fern ist der Vorschlag mit der Statemaschine aber sehr gut zu gebrauchen, der macht ja genau das mit dem "warten bis..."
Bis ich euch ein Programm zeigen kann, dauerts wohl noch a bissl, aber nur so weit: Ich gehe momentan davon aus, dass die datenzwischenverarbeitung (wird eine Art Datenkompression) langsamer vonstatten geht, als die Datenaufnahme, die ich eigentlich beliebig schnell machen kann (hängt nur von der Bitrate der A/D-Wandlerkarte ab, und da gibts sehr schnelle). Die Zwischenverarbeitung der Daten brauch ich, da ich solche Datenmengen nie auf ner Festplatte speichern kann. Mehr zu erklären wär grad zu viel.
Und wenns geht, würde ich schon gern ein paar Megasample/s durch mein System jagen.

Gruß und Danke nochmal
Karl
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.06.2010, 13:28
Beitrag #9

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.697
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Pausieren von parallel ablaufenden Producer/Consumer Schleifen
' schrieb:Die Zwischenverarbeitung der Daten brauch ich, da ich solche Datenmengen nie auf ner Festplatte speichern kann.
Mach dich mal schlau: In LV90 (oder schon 86?) gibt es ein TDMS-Streaming auf DAQmx-Ebene!

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.06.2010, 13:40
Beitrag #10

dimitri84 Offline
Astronaut
*****


Beiträge: 1.496
Registriert seit: Aug 2009

2020 Developer Suite
2009
DE_EN

53562
Deutschland
Pausieren von parallel ablaufenden Producer/Consumer Schleifen
' schrieb:Mach dich mal schlau: In LV90 (oder schon 86?) gibt es ein TDMS-Streaming auf DAQmx-Ebene!
http://zone.ni.com/devzone/cda/tut/p/id/9574

„Sag nicht alles, was du weißt, aber wisse immer, was du sagst.“ (Matthias Claudius)
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
Rainbow Programm pausieren Kaya 14 8.554 11.09.2023 12:15
Letzter Beitrag: GerdW
  Queue verwendung in komplexer Producer/Consumer Abhängigkeit Ksanto 8 5.761 03.04.2017 20:14
Letzter Beitrag: Ksanto
  2 Schleifen parallel bedienen HTL_HL 3 4.456 12.02.2016 13:05
Letzter Beitrag: Lucki
  Mehrere Schleifen parallel ausführen! houss 7 13.030 06.08.2013 14:41
Letzter Beitrag: houss
  Producer/Consumer? Neon88 2 5.201 12.09.2012 17:07
Letzter Beitrag: Neon88
  VI pausieren ohne Blockdiagramm anzuzeigen 052ftemu 4 5.010 27.06.2012 16:34
Letzter Beitrag: 052ftemu

Gehe zu: