Focus-Problem - Druckversion +- LabVIEWForum.de (https://www.labviewforum.de) +-- Forum: LabVIEW (/Forum-LabVIEW) +--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein) +--- Thema: Focus-Problem (/Thread-Focus-Problem) |
Focus-Problem - suamikim - 18.05.2006 09:34 Hallo zusammen! Ich arbeite gerade zum 1. mal mit LabVIEW und bin mit meinem Programm beinahe fertig, allerdings bin ich gerade auf ein Problem gestossen, welches ich alleine wahrscheinlich nicht lösen kann: Um das ganze ein wenig besser erklären zu können habe ich mal einen Screenshot angehängt: [attachment=2143] Folgendes Problem: Die ganzen Zeigerelemente (und auch Knöpfe usw.) im unteren Bereich werden in einer 10-ms-timed-loop ständig aktualisiert (lesen FieldPoint-Werte aus). Mein Problem ist nun, das ich in die markierten numerischen Eingabefelder oben nichts schreiben kann, da sie den Focus im selben Moment wieder verlieren, in dem ich mit der Maus darauf klicke um etwas hineinzuschreiben. Ich geh mal davon aus, dass dieses Verhalten auftritt, weil sich die unteren Anzeigeelemente bei jeder Aktualisierung den Focus holen. Gehe ich richtig in der Annahme und was könnte ich dagegen machen? danke, mfg mike ps.: Ich komme aus der objektorientierten Programmierung und musste dieses Programm mit LabVIEW-Wissen=0 in relativ kurzer Zeit "aus dem Ärmel schütteln", was dazu geführt hat, dass ich mich vor Beginn nicht ausreichend mit den Programmier-Paradigmen der flussgesteuerten Programmierung auseinandersetzen konnte. Mittlerweile hab ich aber mitbekommen (auch über das Forum hier), dass die Art und Weise, wie ich dieses Programm "gebastelt" habe wahrscheinlich gegen alle Regeln verstößt, die es so gibt (lokale Variablen, Code zu wenig ausgelagert, also beinahe alles in einem riesigen VI, viele Sequenzen und Eventstrukturen, ...). Hat zwar nicht direkt mit meinem Problem zu tun, aber ich will nur, dass ihr Bescheid wisst, bevor ihr vielleicht einen Code-Auszug sehen wollt Focus-Problem - Lucki - 18.05.2006 14:49 Zunächst meinen herzlichen Glückwunsch zu diesem VI mit einem so professionellem Aussehen. Es ist kaum zu glauben, daß Du LabVIEW-Anfänger bist. Und sei nicht so bescheiden, es wird wohl auch der dahinterligende Code nicht so schlecht sein wie Du uns hier glauben machen willst. Tja, ich kenne LabVIEW schon seit etlichen Jahren, aber so ein Problem ist mir noch nicht untergekommen. Ich stochere also selbst im Nebel. Auf alle Fälle würde ich folgendes checken: a) Der Focus kann auf die Anzeigen nur gerichtet werden, wenn sie nicht als Anzeigen, sondern als Bedienelemete konfiguriert sind. Das könnte möglich sein und man sieht das den Anzeigen nicht an. Es funktioniert auch alles, die interne Wertzuweisung würde dann über lokale Variablen erfolgen. Also checken und gegebenenfalls ändern. b) Der Focus kann auch über Eigenschaftsknoten zugewiesen werden. Hast Du solche Eigenschafstknoten im Programm, vielleicht unwissentlich, verwendet? (Es gibt die beiden den Focus betreffenden Eigenschaften "Bei Tab überspringen" und "Focus") c) Bearbeiten/Tabulatorreihenfolge im Hauptmenü anwählen: Hier siehst Du mit einem Blick, auf welche Bedienelemente überhaupt focussiert werden kann. Über Eigenschaften/Tastatursteuerung kann man den Focus auch abwählen (Gilt für Tastatursteuerung, nicht für die Maus) d) Es kommt vereinzelt zu Irregularitäten bei der Bedienung, wenn in den Warteschleifen kein Timer enthalten ist. Test mit Windows Taskmanager/Systemleistung. Wenn LabVIEW im Leerlauf 100% Systemleistung braucht, dann fehlen solche Timer. Focus-Problem - suamikim - 23.05.2006 08:55 <div align="left">Hallo Lucki, vielen Dank erstmal für die Antwort und das Lob ' schrieb:a) Der Focus kann auf die Anzeigen nur gerichtet werden, wenn sie nicht als Anzeigen, sondern als Bedienelemete konfiguriert sind. Das könnte möglich sein und man sieht das den Anzeigen nicht an. Es funktioniert auch alles, die interne Wertzuweisung würde dann über lokale Variablen erfolgen. Also checken und gegebenenfalls ändern.Die Anzeigen sind alle wirklich nur Anzeigen (Indicator, weil englische Installation) und die Zuweisung erfolgt eigentlich direkt über das entsprechende Terminal (also nicht über lokale Variablen). Zitat:B) Der Focus kann auch über Eigenschaftsknoten zugewiesen werden. Hast Du solche Eigenschafstknoten im Programm, vielleicht unwissentlich, verwendet? (Es gibt die beiden den Focus betreffenden Eigenschaften "Bei Tab überspringen" und "Focus")Ich benutze mehrere "Property nodes", allerdings nie für die von dir genannten Eigenschaften "Bei Tab überspringen" oder "Focus". Zitat:c) Bearbeiten/Tabulatorreihenfolge im Hauptmenü anwählen: Hier siehst Du mit einem Blick, auf welche Bedienelemente überhaupt focussiert werden kann. Über Eigenschaften/Tastatursteuerung kann man den Focus auch abwählen (Gilt für Tastatursteuerung, nicht für die Maus)Ok, hab ich mir angesehen. Die von mir verdächtigten Anzeigen bekommen alle keinen Fokus, allerdings ist mir aufgefallen, dass einige Controls, die eigentlich unsichtbar sind eine Nr. besitzen. Sollte ja eigentlich kein Problem sein (denke mal nicht, dass es sich hierbei um einen Bug handelt, sondern es so gewollt ist) kommt mir aber ein wenig unlogisch vor ... Tab-Reihenfolge [attachment=2140] Zitat:d) Es kommt vereinzelt zu Irregularitäten bei der Bedienung, wenn in den Warteschleifen kein Timer enthalten ist. Test mit Windows Taskmanager/Systemleistung. Wenn LabVIEW im Leerlauf 100% Systemleistung braucht, dann fehlen solche Timer.Bei der Ausführung des VI's fällt mir kein besonderes hoher Ressourcen-Verbrauch auf (weder was CPU-, noch was Speicher-Auslastung betrifft). Habe übrigens eine neue Vermutung, was an meinem Problem Schuld sein könnte: Meine Hauptschleife (10-ms-timed-loop) besteht aus einer Sequenz mit insgesamt 8 Frames, wobei in den 1. 7 Frames die einzelnen FieldPoint-Module (bzw. Kanäle) nacheinander ausgelesen werden (*1). Das 8. Frame besteht wiederum aus einer Sequenz mit 3 Frames (1. mögliche Fehlerbehandlung, 2. speichert aktuelle Werte in Datei, 3. überprüft Verbindungs-Status (nur bei Verbindungs-Aufbau)). Im 2. Frame wird wie erwähnt die aktuellen Werte in eine Protokoll-Datei geschrieben, was ich folgendermaßen gelöst habe: Das schreiben übernimmt ein von mir geschriebenes Sub-VI, welches ich allerdings aus unterschiedlichen Programmteilen heraus aufrufen muss (also nicht nur aus der oben beschriebenen Hauptschleife), deshalb hab ich ein unsichtbares Boolsches Steuerelement ("Write Status") erstellt, von dem ich das Value-Changed-Ereigniss in einer eigenen Schleife abfange und darin die Sub-VI aufrufe (*2): [attachment=2141] Der Aufruf dieses Events sieht zB. in meiner Hauptschleife (8. und letztes Frame) folgendermaßen aus: [attachment=2142] Das Description-Property setzte ich aus folgendem Grund: Der Sub-VI-Aufruf verlangt eine bestimmte Status-Nr, anhand welcher es zB. entscheidet, ob in der Protokoll-Datei alle Werte oder nur der übergebenen Status-Text gespeichert werden soll (es gibt noch mehrere Details, die diese Status-Nr. ausssagt, welche aber hier irrelevant sind). Kann es nun sein, dass dieser Aufruf der beinahe alle 10 ms stattfindet, schuld dafür ist, dass meinem Eingabeelement ständig der Focus "geraubt" wird und wie könnte ich das umgehen ohne die ganze Programmstruktur über den Haufen werfen zu müssen? danke, mfg mike ps.: Ich hab hier noch ein paar prinzipielle Fragen zur Programmstruktur gestellt, auf welche ich allerdings nicht unbedingt eine Antwort erwarte, mich aber trotzdem darüber freuen würde (kann ja nicht verlangen, dass ich hier in Grundlegende Dinge der LabVIEW-Programmierung eingeführt werde pps.: Kann leider Momentan nicht testen, da mir meine FieldPoint-Module "etnwendet" wurden und ich erst warten muss, neue zu bekommen, deshalb kann ich auch nur Vermutungen anstellen, ... Off topic (prinzipielle Fragen, feststellungen): *1: Prinzipiell widerspricht eine Sequenz ja schonmal dem Flussgesteuerten Konzept, oder liege ich da falsch? Ich benutze diese allerdings sehr häufig, da ich wie hier zB. die Fehlerbehandlung so leichter steuern kann...). *2: Auch hier geh ich mal davon aus, dass ich die Ereigniss-Struktur ziemlich "missbrauche" und das ganze bestimmt eleganter lösen könnte. Wie man im Screenshot der Ereignis-Struktur sieht bin ich spätestens hier mehr oder weniger "gezwungen" lokale Varialben zu verwenden. Generell benutze ich sehr viele Ereignis-Strukturen (zB. bei jedem Button, um die entsprechende Aufgabe abzuarbeiten, ...), was ja wiederum nicht sehr Flussgesteuert ist, hab aber leider keine Ahnung, wie ich die Benutzer-Eingaben sonst abfangen könnte, ...</div> Focus-Problem - suamikim - 15.12.2006 11:50 Hallo zusammen! Sorry, dass ich den Thread jetzt wieder aus der Versenkung hole, aber mein Problem ist noch immer vorhanden :angry2:(war ja auch nie weg, hab mich nur in der Zwischenzeit "wichtigeren" Dingen gewidmet und das ganze hinten angestellt @Lucki Nachdem du damals ja ein Problem mit dem posten hattest poste ich hier einfach mal deine PN, damit wir besser diskutieren können ' schrieb:Ich kann keinen Beitrag im Forum absenden, irgendetwas funktioniert nicht. Versuche es mal so Irgendwie sind wir da wohl beide ein wenig mit den Anzeigen/Bedienelementen (bzw. Inidcators/Controls) durcheinander geraten Bei den Elementen handelt es sich um Controls (Bedienelemente), dh. sie sind auf jeden Fall bedienbar und die neuen Werte weise ich über lokale Variablen zu. Mittlerweile konnte ich das Problem auf jeden Fall ziemlich genau eingrenzen (der folgende Beispielcode ist aus einer anderen, etwas "kleineren" Anwendung, als der zu Beginn des Thread diskutierten, allerdings ist die Abarbeitung des ganzen bei beiden ziemlich ähnlich): Im Prinzip hab ich 3 Schleifen:[list] [*]1 Hauptschleife (nennen wir sie im folgenden main-loop), bei welcher es sich um eine 100-ms-Timed-Loop handelt. Diese beinhaltet eine Sequenz, wobei bei der letzten Frame über das Value-Changed-Ereigniss der boolschen Variable "Write status" das schreiben der aktuellen Werte in eine Protokoll-Datei auslöst (Screenshot 1 bzw. 2). <> [*]2 normale While-Schleifen, welche lediglich mehrere Events abfangen. In der 2. Schleife (nennen wir sie event-loop) wird ua. auch das "Write status"-Value-Changed-Event abgefangen (Screenshot 3) und ein Sub-VI aufgerufen, welches wiederum die aktuellen Werte in die Protokoll-Datei schreibt<> [st]Nach ein wenig testen hab ich jetzt festgestellt, dass (wie früher schon mal vermutet) das ständige Aufrufen des "Write status"-Value-Changed-Events die Ursache für den Fokus-Verlust darstellt. Wenn ich, wie in Screenshot 1 abgebildet das Value-Changed-Event niemals aufrufe, kann ich alle Elemente ohne Fokus-Verlust bedienen. Sobald ich aber das Event wieder aufrufe (Screenshot 2) verlieren meine Bedienelemente nach kürzester Zeit den Fokus wieder und sind unbedienbar (dh. man kann über die Up-/Down-Buttons mit der Maus die Werte noch ändern, nicht jedoch über die Tastatur). Screenshot 1 (main-loop) [attachment=4351] Screenshot2 (main-loop) [attachment=4352] Screenshot 3 (event-loop, Abarbeitung des "Write status"-Value-Changed-Event) [attachment=4360] Das Problem wird also entweder sein, dass ich im Event über lokale Variablen den aktuellen Wert der Bedienelemente abfrage, oder aber das ich ein Sub-VI aufrufe. Wie könnte ich dieses Problem lösen? Hab leider keine Ahnung... danke, mfg |