LabVIEWForum.de - Hauptprogramm weiter ausführen bei SubVI-Aufruf

LabVIEWForum.de

Normale Version: Hauptprogramm weiter ausführen bei SubVI-Aufruf
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Halloechen liebe Leut,

ich hab so ziemlich ein aehnliches problem aber fand bisher keine loesung durch eure posts... Sad

Folgendes Szenario:
Ich habe 2 Whileloops wie auf dem Bild unten zu erkennen. Hierbei ist oben eine Event-Structure. Und in der unteren Loop werden die Events mit Hilfe von Queues abgearbeitet. Und nun habe ich Events in denen ich subVIs calle die sogesehen eine Art Pop-Up darstellen und waehrend des Main VIs laufen soll. Jedoch wenn ich ein solches subVI mit dem Button-"Show cooler tracking" aufrufe dann steht die untere Loop bis ich das subVI (Pop-Up) wieder schliesse. Soll heissen der Indicator "Event Handling" bleibt zunaechst stehen. Was er nicht sollte!

Ich habs auch so versucht mit einer 3. Loop unter den ersten beiden. Jedoch wird diese komischerweisse komplett ignoriert...

Weiss jemand evtlle Einstellungen die ich beim subVI taetigen kann das dieses sogesehen in einem weiteren Thread paralell laeuft.

Hier das Bild
lv11_img
[attachment=39008]
Think Dataflow!
Eine Struktur (in diesem Fall die Case-Struktur in der unteren Loop) wird erst dann beendet, wenn alle VIs/Elemente, die darin enthalten sind, abgearbeitet sind.
Du rufst quasi einen Dialog auf. Der ist aber erst abgearbeitet, wenn du das Fenster wieder schließt.

Mögliche Lösung:
-Dynamischer Start des "Popup" per VI-Server-Aufruf.
-Auslagerung dieser Aufrufe in weitere parallele Loops.
-etc. etc.

Gruß, Jens
Seitliche Arabeske zum Thema:
Habe neulich ein andere Methode gesehen, wie man SubVIs aufrufen kann und das Haupt-VI läuft weiter. Der Trick ist: Das SubVI hat gar keine Schleife, in der es dauernd läuft. Es wird von Haupt-VI alle paar ms wieder aufgerufen, so dass es so aussieht, als ob es parallel zum Haupt-VI läuft.
Habe mal ein quick&dirty Beispiel gemacht.
Ich hab es dank eines Kumpels loesen koennen, und dabei ist die loesung ziemlich easy gewesen Wink

Anhand der Bilder versteht man sicher mehr.

Im Grunde geht alles mit Referenz, und im ersten Bild sieht man den Aufruf. Die Einstellung des subVIs die ihr beachten solltet waere bei "VI Propertys" "Window Appeareance" und dann oben rechts Floating anstatt Modal. Erst dann kann man auch wieder im Hauptfenster rumfingern.
Sowie bei "Execution" rechts "same as caller" einstellen.

Dann halt den Code wie folgt in einen Case.
[attachment=39026]

Wenn man im hauptfenster das programm beendet also alles stoppt soll das subVi natuerlich auch stoppen. Daher sieht man hier im naechsten Bild wie das subVI per Referenz gestoppt wird. Hierbei wichtig zu beachten. Wenn ihr den Befehl yum Stoppen\Beenden eures VIs gebt dann sendet auch eine Art Befehl "Stop Show Camera" wie man in folgendem Bild sieht.
[attachment=39027]

Dann muss noch im subVI selbst am Schluss eine Referenz yu sich selbst gesetzt werden die dann sagt schliesse das Front-Panel.
[attachment=39028]


Soo dadurch lauft das subvi paralell zum Hauptvi und kann sogar Werte zeitgleich rueber senden. Dazu halt eine Invoke Node mit "Control Value" und dann halt "Get" oder "Set" diese verlangen dann halt die Values als Variant aber das klappt ja easy Wink

Wenn jemand darin einen Fehler findet oder denkt es koennte schief gehen. Bitte melden Big Grin

peace Adi
Den popup aufruf mach ich auch so. Allerdings beendest du das popup ziemlich rabiat mitten in der Ausführung. Ich mach das beenden so:
popup enthält whileschleife mit eventstruktur mit timeout case. Im timeout case wird eine globale variable abgefragt. wenn main-vi geschlossen wird, wird diese globale auf T gesetzt und damit die whileschleife im popup auch beendet. siehe anhang.

Man könnte es auch mit einem benutzerdefiniertem event machen, allerdings hatte ich bisher nicht die Muße, dass auszuprobieren.

Du könntest übrigens dein Element in Queue einfügen etwas platzsparender machen, in dem du die Elemente in ein array packst und sie dann per For-schleife einfügst. siehe anhang.
Mag sein das es etwas rabiat rueberkommt, aber mit Globalen Variablen hantier ich nur ungern. Schon alleine mit Localen Vars sollte sparsam umgegangen werden.

Aber die Idee mit dem Array fuer die Queues werde ich beherzigen keine schlechte Idee, haette man auch selbst drauf kommen koennen Big Grin

peace Adi
globale und lokale Variablen sollte man nicht allgemein verteufeln. Da finde ich deine Methode deutlich schlimmer als der harmlose einsatz dieser Globalen Tongue. Aber das ist auch wieder situationsabhängig. Wenn dein SubVI z.B. nur eine stumpfe anzeige ist, kann mans, denke ich, auch problemlos so beenden wie bei dir.

Die Idee mit dem array ist auch nicht von mir. Das ganze konzept hab ich hierher:
http://expressionflow.com/2007/10/01/lab...hitecture/
Seiten: 1 2
Referenz-URLs