Also das man zwei Eventstrukturen in einem Vi nicht verwenden soll ist mir klar wobei man vorallem jedoch aufpassen soll nicht die gleichen Events zu beobachten.
Kann ich jetzt aber ein MainVi mit einer Eventstruktur haben die mir den Quit Button, Init etc überwacht UND eine weitere Eventstruktur in einem SubVi? Dieses wird durch das MainVi aufgerufen und soll die Werte in einem Typedefcluster updaten. Z.Z mache ich dies durch eine WhileSchleife was aber eine hohe Prozessorauslastung bedeutet. Lieber wäre mir ein Update nur wenn der User einen Wert im Typedefcluster geändert hat.
(28.09.2011 14:51 )Topia schrieb: [ -> ]Also das man zwei Eventstrukturen in einem Vi nicht verwenden soll ist mir klar wobei man vorallem jedoch aufpassen soll nicht die gleichen Events zu beobachten.
Kann ich jetzt aber ein MainVi mit einer Eventstruktur haben die mir den Quit Button, Init etc überwacht UND eine weitere Eventstruktur in einem SubVi? Dieses wird durch das MainVi aufgerufen und soll die Werte in einem Typedefcluster updaten. Z.Z mache ich dies durch eine WhileSchleife was aber eine hohe Prozessorauslastung bedeutet. Lieber wäre mir ein Update nur wenn der User einen Wert im Typedefcluster geändert hat.
Wird das SubVI dem User dargestellt? Falls ja spricht eigentlich nicht viel dagegen. (Der Typedefcluster ist schon ein Control im SubVI oder??)
Vorallem musst du darauf achten, dass das Event nicht in zwei verschiedenen Eventstrukturen abgearbeitet werden kann.
Das SubVI musst du dann aber in eine eigene Schleife legen, ansonsten wird das Hauptvi blockiert bis das SubVI abgearbeitet ist (was durchaus auch erwünscht sein kann
)
Gruss Marc
Frage zum Verständnis: Nutzt man zwei Eventstrukturen (die auf das gleiche Event lauschen) in einem VI, dann treten Racing Conditions auf und es ist nicht klar welches von beiden Abgearbeitet wird?
Oder ist das Problem ausschließlich der Potentielle Deadlock durch ineinander verschachtelte Events?
Sprich: In zwei verschiedenen Schleifen in einem VI kann man mit beiden Eventstrukturen auch das gleiche Event abrufen (weil durch das parrallel laufen der Deadlock vermieden wird)?
Also von NI ausdrücklich nicht empfohlen sind mehrere Eventstrukturen in einer Schleife. Wenn aber ein VI aus mehreren parallelen, unabhängig laufenden Schleifen besteht, dann läßt sich eher darüber reden. Zu empfehlen ist es aber trotzdem nicht. Man kann vieles machen, wenn man die Funktionsweise der Eventsrukturen zutiefst verinnerlicht hat - aber das ist sehr oft nicht der Fall, und da kann man nur raten: Finger weg von solchen Strukturen.
Das gleiche Ereignis in mehreren Strukturen zu behandeln, dafür gibt es absolut keine Notwendigkeit. Wenn es doch gemacht würde: Wettlauferscheinungen gibt es da nur indirekt. Solche Ereignisse werden in jeder der beiden Strukturen registriert und wenn es in Struktur 1 behandelt wurde, dann liegt es in Struktur 2 trotzdem noch an und wartet ebenfalls auf die Behandlung. Und diese 2. Behandlung kann in manchen Fällen kompliziert oder umöglich sein, weil die Behandlung davon abhängen kann, ob das Ereignis bereits in Struktur 1 behandelt wurde oder nicht - wovon Struktur 2 aber nichts weiß.
Die Verwendung von Ereignisstrukturen im Haupt- und in jedem SUB-VI ist hingegen völlig unkritisch. Denn die Ereignisse beziehen sich ja immer auf Elemente im selben VI, in dem sich die Struktur befindet. Von daher gibt es keine Überschneidungen. Wenn allerdings mit Referenzen gearbeitet wird, um an die Elemente des jeweils anderen VIs ranzukommen, dann kann es komplizierter werden.
(28.09.2011 16:43 )Lucki schrieb: [ -> ]...Wenn allerdings mit Referenzen gearbeitet wird, um an die Elemente des jeweils anderen VIs ranzukommen, dann kann es komplizierter werden.
Ich werde morgen ein Beispiel hier reinsetzen. Aber ja, der Typedef Control im HauptVi wird als Referenz an das SubVi übergeben wo ich zuerst mit dem Eigenschaftsknoten "Elemente[]" Zugriff auf die Elemente mir hole und dann diesen Elementarray an "Für Ereignisse registrieren" an Wertänderung anschließe um dann mittels dynamisches Event dies in der Eventstruktur zu registrieren.
@Lucki
Schon nen Stop Button kann Sinn machen in zwei Schleifen als Event abzufragen (und daraufhin beide Schleifen zu beenden). Sicher kann man das auch über ne Lokale Variable machen - nur dann ist man auf den Timeout Case der zweiten Schleife oder ein weiteres Event angewiesen. Entsprechend gibt es sinnvolle Anwendungen dafür. Meine Frage bezog sich eigentlich nur darauf ob ein Event sich ähnlich wie ein Bool auf Latch Verhält (einmal ausgelesen ist es "weg" / abgearbeitet) oder eben für jede Eventstruktur "separat" generiert wird.
Das man ansonsten natürlich schauen muss, dass man die Racing Conditions vermeidet die generell durch Parrallelläufigkeit entstehen können ist natürlich selbstverständlich.
(29.09.2011 08:33 )Kiesch schrieb: [ -> ]Meine Frage bezog sich eigentlich nur darauf ob ein Event sich ähnlich wie ein Bool auf Latch Verhält (einmal ausgelesen ist es "weg" / abgearbeitet) oder eben für jede Eventstruktur "separat" generiert wird.
Die Frage hatte ich ja beantwortet: Das Ereignis wird für jede Struktur separat generiert und muß separat behandelt werden, so, als ob zwei verschiedene Ereignisse aufgetreten wären.
Zitat:Schon nen Stop Button kann Sinn machen in zwei Schleifen als Event abzufragen (und daraufhin beide Schleifen zu beenden).
Da gebe ich Dir Recht, und wenn ich etwas anderes gesagt habe, dann geschah das nur aus Feigheit und Angst
Es ist nämlich so, daß die Empfehlungen von Labview zur Mehrfachverwendung von Ereignisstrukturen - so wie auch die Empfehlungen zu lokalen Variablen - hier im Forum oftmals überinterpretiert werden. Wenn man sich dieser Überinterpretation nicht anschließt, läuft man Gefahr, eine ganze Meute auf sich zu hetzen und einen langen, schon x-mal gehabten Thread mit den immer gleichen Argumenten loszutreten. Das wollte ich auf alle Fälle vermeiden.
(29.09.2011 09:25 )Lucki schrieb: [ -> ] (29.09.2011 08:33 )Kiesch schrieb: [ -> ]Meine Frage bezog sich eigentlich nur darauf ob ein Event sich ähnlich wie ein Bool auf Latch Verhält (einmal ausgelesen ist es "weg" / abgearbeitet) oder eben für jede Eventstruktur "separat" generiert wird.
Die Frage hatte ich ja beantwortet: Das Ereignis wird für jede Struktur separat generiert und muß separat behandelt werden, so, als ob zwei verschiedene Ereignisse aufgetreten wären.
Zitat:Schon nen Stop Button kann Sinn machen in zwei Schleifen als Event abzufragen (und daraufhin beide Schleifen zu beenden).
Da gebe ich Dir Recht, und wenn ich etwas anderes gesagt habe, dann geschah das nur aus Feigheit und Angst Es ist nämlich so, daß die Empfehlungen von Labview zur Mehrfachverwendung von Ereignisstrukturen - so wie auch die Empfehlungen zu lokalen Variablen - hier im Forum oftmals überinterpretiert werden. Wenn man sich dieser Überinterpretation nicht anschließt, läuft man Gefahr, eine ganze Meute auf sich zu hetzen und einen langen, schon x-mal gehabten Thread mit den immer gleichen Argumenten loszutreten. Das wollte ich auf alle Fälle vermeiden.
Verbrennt den Ketzer!
Hallo Topia,
ich halte es so wie Ludwig und versuche nur eine Eventstruktur zu verwenden.
Aus der Überlegung heraus, sollte eine Eventstruktur in einem SubVI sich nicht an der in dem aufrufenden VI stören und umgedreht.
Mir ist das aber schon passiert, daß ich ein SubVI in einem Subpanel im MainVi eingeblendet habe.
Dort wird es nur zu bestimmten Zeiten ausgeführt und in den anderen Zeiten läuft eben das MainVI.
Wenn das SubVI nicht lief, reagierte seltsamer Weise aber trotzdem die Eventstruktur darin wenn ich ein Control bediente und hängte damit das Programm auf. Nur das entfernen der Eventstruktur im SubVI löste die Probleme.
Grüße
Andreas