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!
18.08.2018, 18:38 (Dieser Beitrag wurde zuletzt bearbeitet: 18.08.2018 18:53 von Lucki.)
Ich verwende in einem Projekt mehrere Schieberegler, deren aktuelle Werte über eine serielle Schnittstelle an ein µP-System weitergegeben werden. Die Werte werden aber auch im HauptVI verwendet. Das Erkennen der Wertänderungen erfolgt in Ereigniscases. Dort werden die neuen Werte, mit Adresse versehen, in eine Queue gesteckt, die dann woanders ausgelesen wird und wo die Daten über RS232 gesendet werden.
Das Problem ist: Mit "Wertänderung" die Ereignisse auszulösen geht nicht. Das Ergebnis wäre ein Maschinengewehrfeuer von Ereignissen beim Schieben des Sliders, welches die Schnittstelle überfordern würde.
Also nimmt man als Ereignis "Maustaste losgelassen". Das geht, ist aber unzuverlässig. Es funkioniert nämlich nur, wenn die Maustaste innerhalb des Slider-Bereiches losgelassen wird. Deser Bereich ist aber ganz schmal, denn das ist nur der wenige Pixel breite Schieberegler selbst. Wenn man während des Stellens mit dem Mauszeiger etwas daneben kommt, so fällt das überhaupt nicht auf, weil der Slider weiterhin mit dem Mauszeiger mitgeht. (Der Mauszeiger kann sogar meilenweit vom Schieberegler entfernt sein, und er läßt sich immer noch bedienen). Für die Ereignisauslösung gilt das aber leider nicht. Wenn der Mauszeiger beim Loslassen der Mautaste nicht innerhalb des Schieberegler steht, dann findet kein Ereignis statt. Das Schlimme ist: man merkt das gar nicht. Die Wertänderung in der Anzeige und im HauptVI findet ja statt, nur im µP kommt nichts an.
Ich halte das für einen üblen Bug. Aber was kann man dagegen machen? Hat hat hier schon mal jemand mit dem gleichen Problem zu tun gehabt und kann mir etwas raten?
Anzeige
18.08.2018, 21:42 (Dieser Beitrag wurde zuletzt bearbeitet: 18.08.2018 21:49 von IchSelbst.)
(18.08.2018 18:38 )Lucki schrieb: Ich halte das für einen üblen Bug.
Das ist kein Bug. Das ist so - und das gehört auch so. Es kommt kein Event für das Schieberegler-Objekt, weil die Maus nicht im Schieberegler steht. Das ist logisch.
Zitat:Aber was kann man dagegen machen?
Nimm das Objekt, in dem sich die Maus offensichtlich befindet: also "Fensterbereich: Maustaste losgelassen". In diesem Event fragst du einfach den Schieberegler ab und leitest den Wert weiter. Wenn du auch noch eine Wertänderung programmierst (z.B. mit Rückkopplungsknoten) kannst du auch nur dann weiterleiten, wenn offensichtlich der MouseUp am Schieberegler stattfindet.
Nachtrag:
Ich glaube, das ganze liegt am Betriebssystem, nicht an LabVIEW. Nicht LabVIEW handhabt den Schieberegler während der Schieber sich bewegt, sondern das Betriebssystem. Das schließe ich auch daraus, weil sich der Schieberegler auch dann noch verschiebt, wenn die Maus sich überhaupt nicht mehr im Bereich des Fensters der Applikation befindet.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
ich habe das über einen QMH gelöst:
- die Eventstruktur schreibt alle Events in eine Queue
- der MH liest die Queue immer wieder komplett aus und filtert die Einträge: von Events einer Quelle wird nur der aktuellste Wert verwendet...
- das könnte man noch mit lossy queues kombinieren
Zitat:von Events einer Quelle wird nur der aktuellste Wert verwendet
Diese Vorgehensweise entspricht einer zeitlichen Rasterung. Letztendlich kann man das ganze so auslegen, dass z.B. maximal alle 250ms der eben aktuelle Wert zur Ziel weitergeleitet wird. Wie man diese Rasterung realisiert, ist zweitrangig. Theoretisch geht das auch mit Zeit-Zählen direkt im Haupt-VI. Queues sind zwar aufwändiger, sind aber eine ideale Lösung ...
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
19.08.2018, 16:39 (Dieser Beitrag wurde zuletzt bearbeitet: 19.08.2018 16:40 von Lucki.)
(18.08.2018 21:42 )IchSelbst schrieb: [quote='Lucki' pid='192311' dateline='1534613893']Ich halte das für einen üblen Bug.
Das ist kein Bug. Das ist so - und das gehört auch so. Es kommt kein Event für das Schieberegler-Objekt, weil die Maus nicht im Schieberegler steht. Das ist logisch.
Da gebe ich Dir zwar Recht, aber genau so logisch wäre es, dass eine Wertänderung am Schieberegler nur solange stattfinden kann, solange sich der Mauszeiger im Objekt befiindet. Das ist leider nicht der Fall. Und das Ideal wäre: Wenn man im Objekt die Maustaste drückt, kommt der Mauzeiger, solange die Taste gedrückt bleibt, nicht mehr aus dem Objekt heraus. D.h. man kann dann zwar noch den Wert ändern, nicht aber mit dem Cusor in der ganzen Weltgeschichts sinnlos herumspazieren können. So weit reichen aber meine Programmierkünste nicht, es wird wahrscheinlich mit Labview auch gar nicht möglich sein.
@Gerd und Ichselbst
Vielen Dank für die Tips. Ich habe es jetz so gemacht, dass ich nicht die Queue, über die ich die neuen Daten sende, dezimiere, sondern die Ereignisqueue selbst. Anbei das VI. Kleiner Schönheitsfehler: Die Daten werden immer noch zwei Mal gesendet, aber das ist hinnehmbar.
Mein Lösungsvorschlag: Flag setzen, wenn die Maustaste innerhalb des Schiebereglers gedrückt wird. Wenn die Maustaste losgelassen wird (egal wo), checken ob Flag gesetzt wurde. Wenn ja, dann liegt eine Änderung des Schieberegler-Werts vor.
Anzeige
20.08.2018, 15:57 (Dieser Beitrag wurde zuletzt bearbeitet: 20.08.2018 16:25 von Lucki.)
Danke THL, das ist die Ideallösung, die wohl nicht mehr zu toppen ist. Ich frage mich nur, warum es manchmal so schwierig ist, auf so etwas Einfaches zu kommen...
Edit: Du hast vergessen, die boolsche Variable beim Loslassen der Maustaste rückzusetzen. Und ich habe mal das Boolean durch ein Shift-Register ersetzt. Das ändert aber nichts an der Exzellenz Deiner Idee.
Die bisherige Lösung habe ich modifiziert, sie war nicht optimal für die Ereignisbehandlung mehrerer Schieberegler. Wenn sich jemand dafür interessiert: hier ist das VI. Und bitte postet es mir, falls es noch eine Schwachstelle gibt.
(21.08.2018 10:00 )Lucki schrieb: hier ist das VI.
Das ist aber das alte VI. Zum Ausprobieren wegen des Tunnels mit Standard und der Ereignisregistrierung im Ereignis, was mir etwas komisch erscheint, bräuchte ich das Original.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
21.08.2018, 14:24 (Dieser Beitrag wurde zuletzt bearbeitet: 21.08.2018 14:26 von Lucki.)
Entschuldigung, habs korrigiert. Das mit dem dynamischen Ereignis habe ich gemacht, damit man im Ereigniscase "Maustaste loslassen" nicht mehr unterscheiden muß, ob vorher auf dem Schieberegler die Maustaste gedrückt war (also das Loslassen ewas mit der Bedienung des Elementes zu tun hat) oder ob das Loslassen in keinerlei Zudammenhang mit der Bedienung dieses Elementes steht. Der dynamische Case ist überhaupt nur dann und solange aktiv, solange auf dem Element die Taste gedrückt wurde und danach gedrückt gehalten wurde. Und wenn der Case eintritt, hat das Loslassen immer etwas mit der Bedienung des Elementes zu tun.