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!
Ich habe ein Programm mit verschiedenen Funktionen (möchte jetzt nicht zu weit ausholen, welche das alles sind). Mann kann Buttons drücken, sich in dem Programm als User einloggen und dann andere Buttons drücken.
Programmiertechnisch habe ich eine While-Schleife, in der sich eine Case-Struktur befindet. Das eine Case Unterdiagramm stellt den "nicht eingeloggten" Bereich dar, das andere den "eingeloggten" Bereich. In beiden Case Unterdiagrammen befindet sich jeweils eine Ereignisstruktur für die Buttons. Das funktioniert soweit ganz gut.
Ein einziger Button soll in beiden Bereichen (sprich im nicht - und im eingeloggten Bereich) bedienbar sein und verursacht Probleme.
Wenn ich den Button zwei mal drücke, wird das Ereignis zwei mal ausgeführt. Wechsle ich in den eingeloggten Bereicht, also ins andere Case Unterdiagramm wird ohne den Knopf zu drücken das Ereignis wieder zwei mal ausgeführt.
Jetzt besteht die Frage, warum die Wertänderung (in meinem Beispiel 2 mal) nicht 'gelöscht' wird, sondern von der zweiten Ereignisstruktur 'gemerkt' wird, obwohl diese ja nicht läuft.
Ich habe die Umstellung auf andere auslösende Ereignisse schon ausprobiert, aber mit nur geringem Erfolg. Entweder funktioniert das Ein- oder das Ausloggen ohne diesen Fehler, aber nicht beides fehlerfrei.
Die Ereignisse werden in so vielen Puffern gespeichert, wie du Event Diagramme in deinem BD hast, egal ob laufend oder nicht. Du solltest dein Prog so umbauen, dass du nur eine Eventstruktur insgesamt hast.
danke für die schnelle Antwort!!
Da das VI 1,5 MB groß ist, wird aus dem posten nichts ;-) . Aufgrund der Größe kann ich auch nicht eine Eventstruktur daraus machen.
Besteht die Möglichkeit Events in den Puffern zu löschen?
Ansonsten ist mir gestern Abend noch die Idee gekommen, dass man den Button zwei mal setzt (der Zweite direkt darüber) und je nach Eventstruktur den einen oder anderen unsichtbar stellt. Ist zwar ne Mogelpackung, aber dürfte funktionieren.
Mehrere Ereignisstrukturen sollte man zwar möglichst vermeiden, vor allem in ein und derselben While-Schleife. Es ist ja nicht möglich, daß das Programm sich in beiden Ereignisstrukturen zugleich im Wartezustan auf ein Ereignis befinden kann.
Wirklich tödlich ist es, wenn eine - oder sogar beide - Schleifen keinen Timout angeschlossen haben. Dann tritt ein Blockade ein.
Aber wenn schon mehrere Ereignisstrukturen (in einer Hauptschleife) , dann ein möglichst kurzes timeout für beide Ereignsistrukturen, denn während des Wartens auf das timout wird immer die andere Schleife blockiert.
Ein Ereignis zu löschen seh ich kein Grund. Man kann ja in dem betreffenden Ereiggniscase eine Casestruktur einbauen, und wenn das Ereignis nichts bewirken soll, dann wird eben ein leerer Case ausgeführt.
Was spricht eigentlich dagegen, daß Du eine Kopie deines VIs für Demonstratinszecke so weit abspeckst, daß die Funkion auf das hier angefragte Problem reduziert ist? Deine "Mogelpackung" ist garantiert unnötig, da gibt es bessere und ganz einfache Lösungen - aber nicht ohne Dein VI zu sehen.
Vielen Dank für deine Antwort.
Ich bin im moment sehr unter Zeitdruck. Das Programm auf die relevanten Funktionen abzuspecken dauert einfach zu lang... Da gibt es so viele SubVIs und Zusammenhänge (wie z.B. wichtige Benutzerereignisse), dass ich das Programm nicht "mal eben" reduzieren kann. Ich hatte auch kurz angefangen, die entsprechende Funktion schnell provisorisch als neues VI zu programmieren, aber auch das zeigt sich als sehr (zu) zeitaufwendig.
Trotzdem danke ich dir, dass du drüber geguckt hättest!
Sollte doch etwas Zeit ergeben, werde ich das Ganze hier reinstellen. Denn prinzipiell wäre ich natürlich auch für eine saubere Programmierung.
' schrieb:Mehrere Ereignisstrukturen sollte man zwar möglichst vermeiden, vor allem in ein und derselben While-Schleife. Es ist ja nicht möglich, daß das Programm sich in beiden Ereignisstrukturen zugleich im Wartezustan auf ein Ereignis befinden kann.
Wirklich tödlich ist es, wenn eine - oder sogar beide - Schleifen keinen Timout angeschlossen haben. Dann tritt ein Blockade ein.
Aber wenn schon mehrere Ereignisstrukturen (in einer Hauptschleife) , dann ein möglichst kurzes timeout für beide Ereignsistrukturen, denn während des Wartens auf das timout wird immer die andere Schleife blockiert.
Ein Ereignis zu löschen seh ich kein Grund. Man kann ja in dem betreffenden Ereiggniscase eine Casestruktur einbauen, und wenn das Ereignis nichts bewirken soll, dann wird eben ein leerer Case ausgeführt.
Was spricht eigentlich dagegen, daß Du eine Kopie deines VIs für Demonstratinszecke so weit abspeckst, daß die Funkion auf das hier angefragte Problem reduziert ist? Deine "Mogelpackung" ist garantiert unnötig, da gibt es bessere und ganz einfache Lösungen - aber nicht ohne Dein VI zu sehen.
Hallo Lucki,
hier ist mein VI.
So funktioniert es:
Durch den Play-Button kann man sich als User einloggen (Einlog-Funktion habe ich natürlich gelöscht) und durch den Stop-Button wieder ausloggen. Das Problem verursacht der Button links neben dem Play-Button.
Zur Verdeutlichung der Ausführung des "Problem-Button" erscheint nach Drücken eine Meldung.
Und jetzt nochmal zum Problem:
Wenn ich den "Problem-Button" drei Mal drücke und mich danach einlogge (der Play-Button), wird nochmal drei Mal der Problem-Button Ereignis ausgeführt.
Umgekehrt vom eingeloggten in den ausgeloggten Bereich das Gleiche.
1. Ich weiss ja nicht, wie groß dein Monitor ist (ich sitz hier ja auch schon vor einem 22"), aber dein BD ist einfach VIEL zu groß, zwar aufgeräumt (dafür Lob), aber VIEL zu groß. Wenn ich mit der Maus wie verrückt scrollen und schieben muss, um zu sehen, wo die Strukturen starten und aufhören, dann ist was falsch. Und da werde ich auch nicht weiteranalysieren und exakte Verbesserungsvorschläge liefern.
2. Es bleibt dabei, 2 Event-Strukturen innerhalb derselben While-Schleife, und dann auch noch 2 Event-Strukturen, die auf dasselbe Event (also denselben Mausklick) reagieren sollen, das führt halt nun mal zu seltsamen Reaktionen. Deshalb wird ja auch von NI selbst in der Hilfe von der mehrfachen Verwendung der Event-Struktur innerhalb eines Events dringend abgeraten! Und man kann es auf jeden Fall anders machen. Aber da sind wir wieder bei Punkt 1, dein BD ist mir zu unübersichtlich, um Änderungen vorzuschlagen.
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
' schrieb:1. Ich weiss ja nicht, wie groß dein Monitor ist (ich sitz hier ja auch schon vor einem 22"), aber dein BD ist einfach VIEL zu groß, zwar aufgeräumt (dafür Lob), aber VIEL zu groß. Wenn ich mit der Maus wie verrückt scrollen und schieben muss, um zu sehen, wo die Strukturen starten und aufhören, dann ist was falsch. Und da werde ich auch nicht weiteranalysieren und exakte Verbesserungsvorschläge liefern.
...und dann ist ja in den verschiedenen Frames auch kaum was drin...
Was mir allerdings ganz gut gefällt, ist die Bedienoberfläche! Sieht schick aus! Aber auc hier eine Kritik: Bei den vielen Tabs geht die Übersicht genauso verloren wie in den Weiten deines Blockdiagramms!
"Is there some mightier sage, of whom we have yet to learn?"
"Opportunity is missed by most people because it is dressed in overalls and looks like work." (Thomas Edison)
das Haupt-VI habe ich nicht selber erstellt, sondern ein erfahrener (!) LabVIEW Programmierer. Ich habe das VI lediglich übernommen und soll es optimieren ;-) .
In den einzelnen Strukturen ist kaum etwas enthalten, da ich alles rausgelöscht habe (ursprüngliche Größe 1,55 MB). Sonst wäre es noch unübersichtlicher.
Die Größe des Haupt-VI zu verändern, würde auch den Rahmen meiner Abschlussarbeit sprengen ;-) .
Die Kritik mit der Größe des VIs kann ich vollkommen verstehen und da in den einzelnen Strukturen kaum etwas enthalten ist, werde ich heute Nachmittag eine etwas übersichtlichere Version reinstellen. Wenn man den ganzen Tag damit arbeitet, vergisst man leider, dass die Struktur für Dritte nicht übersichtlich ist. Ich bitte also um Nachsicht ;-) .
Zum Aufbau des VIs sei noch gesagt, dass eigentlich nur Unterdiagramm 2 der gestapelte Sequenz von Interesse ist (Gestapelte Sequenz 0 bis 1 sind lediglich Initialisierungen). Der Case "Voreinstellung" stellt den ausgeloggten Bereich dar (mit der einen Ereignisstruktur) und der Case "gestartet" den eingeloggte Bereich (mit der zweiten Ereignisstruktur). Um von den eingeloggten Bereich den den ausgeloggten Bereich zu kommen, wird der Case "Stop" noch ausgeführt. Der Case "Exit" dient nur zum beeden des Programms.