Parallele Schleifen synchronisieren?
-
- assistant
- Сообщения: 132
- Зарегистрирован: 26 окт 2009, 23:05
- Версия LabVIEW: 7.1
- Контактная информация:
Parallele Schleifen synchronisieren?
Hallo,
ich habe hier z.b. drei parallele Schleifen.
Meine Idee solche Schleifen (die in meinem Fall auch keinen Datenaustausch untereinander haben) zeitlich zu synchronisieren, ist am Anfang des Programmes 'GetTime' zu verwenden und dann anhand der Zeitpunkte nach wievielen (milli-)Sekunden bestimmte Ereignisse eintreffen sollen, die Wait-Zeiten der einzelnen Schleifen auszurechnen.
Gibt es elegantere Methoden zum (softwarebasiertem) Timing von parallelen Schleifen ?
And
ich habe hier z.b. drei parallele Schleifen.
Meine Idee solche Schleifen (die in meinem Fall auch keinen Datenaustausch untereinander haben) zeitlich zu synchronisieren, ist am Anfang des Programmes 'GetTime' zu verwenden und dann anhand der Zeitpunkte nach wievielen (milli-)Sekunden bestimmte Ereignisse eintreffen sollen, die Wait-Zeiten der einzelnen Schleifen auszurechnen.
Gibt es elegantere Methoden zum (softwarebasiertem) Timing von parallelen Schleifen ?
And
-
- beginner
- Сообщения: 12
- Зарегистрирован: 18 июн 2009, 17:00
- Версия LabVIEW: 8.6
- Контактная информация:
Re: Parallele Schleifen synchronisieren?
Also ich glaub wenn die Schleifen einfach alle den gleichen Wait-Wert haben, laufen sie bereits synchron. Zumindest tun sie das in meinen Anwendungen.
Grüße
Grüße
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: Parallele Schleifen synchronisieren?
Da würde ich ein Ocurence benutzen. Die eine Schleife macht Timing (normale Wartezeit) und erzeugt das Occurence und die anderen zwei warten aufs Occurence.
-
- assistant
- Сообщения: 132
- Зарегистрирован: 26 окт 2009, 23:05
- Версия LabVIEW: 7.1
- Контактная информация:
Re: Parallele Schleifen synchronisieren?
Die Ocurence darf aber immer nur dann gesetzt werden, wenn die andere Schleife 'arbeiten' soll. Wenn das alle fuenf Minuten ist, waere, dann eben alle fuenf Minuten.
Also muss die Timingschleife zum einen Wissen, wann die andere Schleife etwas machen sollen und zum anderen in jedem Durchlauf eine If-Abfrage machen, ob denn der Zeitpunkt erreicht (bzw. groesser gleich) wurde, an dem die andere Schleife arbeiten muss. If (True) -> Occurence setzen.
Hab ich das richtig verstanden?
Also muss die Timingschleife zum einen Wissen, wann die andere Schleife etwas machen sollen und zum anderen in jedem Durchlauf eine If-Abfrage machen, ob denn der Zeitpunkt erreicht (bzw. groesser gleich) wurde, an dem die andere Schleife arbeiten muss. If (True) -> Occurence setzen.
Hab ich das richtig verstanden?
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: Parallele Schleifen synchronisieren?
Ich habe es so gemeint, wobei die obere Schleife der Taktgeber für die unteren zwei ist. Alle drei laufen syncron.
- Вложения
-
- Occurence.png (7.51 КБ) 11350 просмотров
-
- assistant
- Сообщения: 132
- Зарегистрирован: 26 окт 2009, 23:05
- Версия LabVIEW: 7.1
- Контактная информация:
Re: Parallele Schleifen synchronisieren?
Jo danke - da wuerden alle immer gleichzeitig ausgefuehrt werden. Vielleicht muss ich meine Frage etwas umformulieren:
Wenn man einen echten Zeitmesser haben moechte, der die Zeit mitzaehlt, die seit Programmstart vergangen ist, verwendet man da dann gettime? Oder wie macht man dass?
i * SchleifenWartezeit wuerde zumindest sehr schnell ungenau werden, weil da ja die eigentlichen Operationen welche die Schleife ausfuehrt nicht mitgestoppte werden wuerden.
Wenn man einen echten Zeitmesser haben moechte, der die Zeit mitzaehlt, die seit Programmstart vergangen ist, verwendet man da dann gettime? Oder wie macht man dass?
i * SchleifenWartezeit wuerde zumindest sehr schnell ungenau werden, weil da ja die eigentlichen Operationen welche die Schleife ausfuehrt nicht mitgestoppte werden wuerden.
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: Parallele Schleifen synchronisieren?
Ja, sicher mit dem Zeitstempelunterschied (Zeit vor dem Schleifenbeginn und Zeit der aktuellen Iteration) kannst du es rausfinden.
-
- assistant
- Сообщения: 132
- Зарегистрирован: 26 окт 2009, 23:05
- Версия LabVIEW: 7.1
- Контактная информация:
Re: Parallele Schleifen synchronisieren?
Super, war eben nur nicht sicher ob gettime DIE gaengige Methode fuer Zeitstempel ist oder ob Labview intern da irgendwas anderes in petto hat. Danke dir.
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: Parallele Schleifen synchronisieren?
Du kannst dir vielleicht noch die Timed-Loop anschauen, da gibt es tolle Features, die ich aber nicht kenne
-
- assistant
- Сообщения: 132
- Зарегистрирован: 26 окт 2009, 23:05
- Версия LabVIEW: 7.1
- Контактная информация:
Re: Parallele Schleifen synchronisieren?
Ich hab mir die Timed-Loop noch nicht angeschaut - steht aber irgendwo im unteren Abschnitt meiner to-do list
nochmal zu dem Thema:
Nehmen wir an, es gibt ein Masterloop das die Kontrolle ueber das Timing hat und das eine Steuerdatei einliest welche Informationen enthaelt, wann diverse andere Schleifen gestartet werden muessen. Darueber hinaus enthaelt sie Parameter, die zum Start der anderen Schleifen noetig sind.
Ist ein Notifier die beste Methode hierfuer?
(Ich lese immer "Variablen und Property-Value vermeiden". Der Grund solchige zu vermeiden ist lediglich die Gefahr von Race-Conditions (oder?) - also wenn man es wirklich ordentlich macht, waere es kein Problem. Oder gibt es noch andere Nachteile?
nochmal zu dem Thema:
Nehmen wir an, es gibt ein Masterloop das die Kontrolle ueber das Timing hat und das eine Steuerdatei einliest welche Informationen enthaelt, wann diverse andere Schleifen gestartet werden muessen. Darueber hinaus enthaelt sie Parameter, die zum Start der anderen Schleifen noetig sind.
Ist ein Notifier die beste Methode hierfuer?
(Ich lese immer "Variablen und Property-Value vermeiden". Der Grund solchige zu vermeiden ist lediglich die Gefahr von Race-Conditions (oder?) - also wenn man es wirklich ordentlich macht, waere es kein Problem. Oder gibt es noch andere Nachteile?
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: Parallele Schleifen synchronisieren?
Notifier oder Queue wäre das beste dafür. Ich habe auch ein ähnliches Projekt gemacht, alles mit Queues aufgebaut und sogar eine Library daraus gemacht (suche nach "Tasking" in unserem Forum).
Variablen und Property-Value sind asynchron, wenn du an einer Stelle zu spät ausliest, kann es passieren, dass der Wert sich inzwischen schon zwei Mal geändert hat, somit Informationsverlust oder auch Race Conditions.
Gruß, eg
Variablen und Property-Value sind asynchron, wenn du an einer Stelle zu spät ausliest, kann es passieren, dass der Wert sich inzwischen schon zwei Mal geändert hat, somit Informationsverlust oder auch Race Conditions.
Gruß, eg
-
- assistant
- Сообщения: 132
- Зарегистрирован: 26 окт 2009, 23:05
- Версия LabVIEW: 7.1
- Контактная информация:
Re: Parallele Schleifen synchronisieren?
habs gefunden, brauch Labview 8.2 dafuer
wird Zeit des die Leute hier mal ein Upgrade kaufen
Queues sind eine Art Notifier mit Buffer nehm ich an?
Ich hab grad mal das im Anhang zusammengebaut.
Ist das grob von der Herangehensweise richtig? Interessant ist, dass die For-Schleife zu warten anfaengt, wenn die Queue voll ist. Die neuen Elemente verfallen also nicht, bzw. ersetzen auch keine alten.
Warum funktioniert der Stop-Button nicht mehr, nachdem alle Queue Elemente abgearbeitet worden sind?
wird Zeit des die Leute hier mal ein Upgrade kaufen
Queues sind eine Art Notifier mit Buffer nehm ich an?
Ich hab grad mal das im Anhang zusammengebaut.
Ist das grob von der Herangehensweise richtig? Interessant ist, dass die For-Schleife zu warten anfaengt, wenn die Queue voll ist. Die neuen Elemente verfallen also nicht, bzw. ersetzen auch keine alten.
Warum funktioniert der Stop-Button nicht mehr, nachdem alle Queue Elemente abgearbeitet worden sind?
- Вложения
-
- queueexample.gif (5.8 КБ) 11308 просмотров
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: Parallele Schleifen synchronisieren?
Sieht gut aus. Die untere Schleife braucht keine Wartezeit, die synchronisiert sich automatisch zu der oberen. Stop funktioniert nicht, weil das Enqueue nun hängt und auf die Daten wartet. Da es keine Daten gibt, hängt die komplette Schleife nach dem Datenflußprinzip.
-
- assistant
- Сообщения: 132
- Зарегистрирован: 26 окт 2009, 23:05
- Версия LabVIEW: 7.1
- Контактная информация:
Re: Parallele Schleifen synchronisieren?
Wenn du anstatt von enqueue dequeue meinst, versteh ich die Erklaerung mit dem Stop-Button. ;)
Die 500 ms sollten nur irgendeinen langwierigen Berechnungsvorgang oder aehnliches simulieren, damit die Queue voll wird. Andernfalls wuerde ein Notifier ja dieselbe Funktion erfuellen :)
Die 500 ms sollten nur irgendeinen langwierigen Berechnungsvorgang oder aehnliches simulieren, damit die Queue voll wird. Andernfalls wuerde ein Notifier ja dieselbe Funktion erfuellen :)
-
- assistant
- Сообщения: 132
- Зарегистрирован: 26 окт 2009, 23:05
- Версия LabVIEW: 7.1
- Контактная информация:
Re: Parallele Schleifen synchronisieren?
Du musst einfach dequeue gemeint haben.
Aber wie wuerde man die untere Schleife denn sauber beenden?
1.
Jedesmal mit 'Queue Status' pruefen ob die Anzahl der Elemente in der Queue groesser 0 ist bevor man 'Dequeue' verwendet und wenn nicht die Schleife abbrechen:
Das wuerde so nicht gehen, denn es kann ja sein, dass die Schleife die die Queue auffuellt langsamer ist als die, die sie ausleert/ausliest und somit die Verarbeitung der Daten zu frueh gestoppt wird.
2.
'Queue Status' kombiniert mit einem Notifier, der geschickt wird, wenn die fuellende Schleife fertig ist:
Hier wuerde die lesende Schleife ja dann erst anfangen zu arbeiten, wenn die Fuellende fertig ist -> schlecht, da koennte man von vorne herein in ein Array schreiben und das danach verarbeiten.
3. TimeOut von Dequeue verwenden: Das koennte gehen wenn man ungefaher weiss, wie lang es dauert bis neue Daten kommen, wenn welche kommen wuerden. Ich schaetze also, dass ist die gaengie Variante...
Aber wie wuerde man die untere Schleife denn sauber beenden?
1.
Jedesmal mit 'Queue Status' pruefen ob die Anzahl der Elemente in der Queue groesser 0 ist bevor man 'Dequeue' verwendet und wenn nicht die Schleife abbrechen:
Das wuerde so nicht gehen, denn es kann ja sein, dass die Schleife die die Queue auffuellt langsamer ist als die, die sie ausleert/ausliest und somit die Verarbeitung der Daten zu frueh gestoppt wird.
2.
'Queue Status' kombiniert mit einem Notifier, der geschickt wird, wenn die fuellende Schleife fertig ist:
Hier wuerde die lesende Schleife ja dann erst anfangen zu arbeiten, wenn die Fuellende fertig ist -> schlecht, da koennte man von vorne herein in ein Array schreiben und das danach verarbeiten.
3. TimeOut von Dequeue verwenden: Das koennte gehen wenn man ungefaher weiss, wie lang es dauert bis neue Daten kommen, wenn welche kommen wuerden. Ich schaetze also, dass ist die gaengie Variante...