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!
04.07.2013, 10:28 (Dieser Beitrag wurde zuletzt bearbeitet: 04.07.2013 10:42 von Hasenfuss.)
vielen Dank, dass Ihr Euch so viel Zeit genommen habt, um mir etwas weiterzuhelfen.
Ich habe mir noch nicht alles im Detail angeschaut, ich möchte aber zu diesem Punkt etwas beantworten:
"Geschrieben von Lucki - 02.07.2013 11:28
Der "Irrsinn" des Programms besteht ja darin, dass das gesamte Programm nicht nur von Haupt-VI aus, sondern auch von jedem SubVI beendet werden soll. Ich wüßte kein praktisches Beispiel, in dem so etwas sinnvoll sein könnte. ..."
1. Mein Beispiel war ein abstrahiertes Beispiel. Ich hatte ein Problem, aber ich kann mein reales Beispiel nicht versenden, so habe ich versucht, durch dieses Problem den bei mir auftretenden Fehler deutlich zu machen. Ausserdem steuerte ich in meinem Beispielprogramm von den SubVIs die Lampen im Haupt-VI, die subVIs konnten zwar einzeln beendet werden, nicht aber die gesamte Anwendung durch ein SubVI.
2. Bei mir gibt es diesen Fall, dass ich mit mehreren Events arbeiten muss - aber vielleicht gibt es ja für mein Problem auch noch eine andere Lösung.
Ich habe ein Haupt-VI, in dem ich ein Unterpanel habe, um dort verschiedene Programm-Module je nach Auswahl hineinzuladen (siehe Bild). Neben dem Unterpanel sind Schalter positioniert, die in der Eventstruktur des Haupt-VIs ausgewertet werden und je nach Schalter wird das entsprechende Unterprogramm in das SubPanel geladen.
Das Unterprogramm 1 besteht aus zwei Teilen, da es dort ein separates Fenster gibt, in dem Einstellungen vorgenommen werden können. Dieses Fenster kann als separates Fenster geladen werden, es soll aber der Übersichtlichkeit auch in das SubPanel geladen werden.
Das Problem ist also nun, dass ich aus dem Unterprogramm heraus das SubPanel des Hauptprogramms verändern möchte. Nun kann ich die Referenz des SubPanels übergeben und das Laden vom Unterprogramm 1 aus machen. Ich habe aber gedacht, dass es schöner ist, wenn ich das Laden des zweiten Moduls von Unterprogramm 1 auch vom Haupt-VI, in dem ich alle Anzeigen aus steuere, mit übernehme. Die Abarbeitung erfolgt aber über Eventstrukturen, also musste ich auch in das Haupt-VI eine Eventstruktur einbauen. Der Übersichtlichkeit halber hatte ich einfach an die bisherigen Benutzerevents ein weiteres Event drangehängt und so ist das "Chaos" entstanden.
Einige dieser Programmblöcke bleiben während der gesamten Laufzeit aktiv. In diesen subVIs arbeite ich sehr oft auch mit Eventstrukturen. In Eventstrukturen kann ich keine Melderereignisse verarbeiten. Darum habe ich in dem Haupt-VI ein Benutzerereignis "Beenden" gesetzt und registriert, dass von allen subVIs aus gelesen wird. Daher in meinem Beispiel die Möglichkeit, die beiden subVIs aus dem Haupt-VI heraus zu beenden.
Zu einer Sache hätte ich gerne nochmal eine Frage. Beim Experimentieren vor einiger Zeit hatte ich mehrere SubVIs aus einem Haupt-VI heraus beendet. Also im Haupt-VI habe ich das Event Stoppen ausgelöst, an alle SubVIs, die Referenz übertragen und es haben sich auch brav alle SubVIs beendet.
Jetzt schreibt ihr mir, dass die Eventstruktur wie eine Queue arbeitet. Das heisst doch, dass es hätte eigentlich garnicht funktionieren dürfen, dass sich beide SubVIs beenden, weil doch dann von einem der beiden VIs das Ereignis verarbeitet wurde. Das verstehe ich grad noch nicht. Oder war das dann "Zufall", dass es funktionierte?
Anzeige
04.07.2013, 18:46 (Dieser Beitrag wurde zuletzt bearbeitet: 04.07.2013 18:47 von Holy.)
(04.07.2013 10:28 )Hasenfuss schrieb: Jetzt schreibt ihr mir, dass die Eventstruktur wie eine Queue arbeitet. Das heisst doch, dass es hätte eigentlich garnicht funktionieren dürfen, dass sich beide SubVIs beenden, weil doch dann von einem der beiden VIs das Ereignis verarbeitet wurde. Das verstehe ich grad noch nicht. Oder war das dann "Zufall", dass es funktionierte?
Das habe ich nicht geschrieben
Ich habe aber geschrieben das jede Eventregistrierung wie eine Queue funktioniert. Dazu mal ein Beispiel:
Event A erzeugen
Event A das erste mal registrieren und somit Eventregistrierung B erzeugen
Event A ein weiteres mal registrieren und somit Eventregistrierung C erzeugen
Eventregistrierungen B und C jeweils an eine eigene WhileSchleife mit Eventstruktur bringen
Was wird jetzt hier passieren?
Wie beschrieben bildet jede der Eventregistrierungen B und C eine eigene Queue ab. Das führt dazu wenn du einmal Event A feuerst kann sowohl an Eventregistrierung B und C ein angekommener Event A verarbeitet werden.
Du hast in deinem Orginalbeispiel im Prinzip Eventregistrierung B geteilt und diese an beide Whileschleifen gleichzeitig gebracht. Jetzt ist logischerweise nur ein Event A da zum abarbeiten und die Probleme beginnen...