Zeitbasierte Ereignisverkettung (Schaltflächenklick-Multiplizität)Java

Java-Forum
Guest
 Zeitbasierte Ereignisverkettung (Schaltflächenklick-Multiplizität)

Post by Guest »

Ich habe ein Programm, das einen Stream von Tasten-/Achsenereignissen des Gamepads erzeugt.
Ich möchte in der Lage sein, Klickmultiplizität zu erkennen.
Im letzten Schritt gibt es eine Flux-Pipeline:

Code: Select all

        final Flux buttonStream = stateStream.getButtonFlux()
.mapNotNull(GamepadIntrospector::introspect)
.filter(Predicate.not(List::isEmpty))
.map(EventMapper::translateButtonTimed)
.filter(notFizzy)
;
wobei EventMapper::translateButtonTimed eine zustandsbehaftete Komponente ist, die feststellen kann, ob der Tastendruck innerhalb der vorkonfigurierten Zeitdauer wiederholt wurde und daher anhält und an Multiplizität zunimmt. Wenn ich also die Taste dreimal schnell drücke, erhalte ich Folgendes:

Code: Select all

01:08:09.696 [pool-1-thread-1] INFO org.asmus.Main -- QualifiedEType(type=A, pressType=CLICK)
01:08:09.873 [pool-1-thread-1] INFO org.asmus.Main -- QualifiedEType(type=A, pressType=DOUBLE)
01:08:10.016 [pool-1-thread-1] INFO org.asmus.Main -- QualifiedEType(type=A, pressType=TRIPLE)
Das bedeutet, dass der Dreifachklick für die Schaltfläche „A“ korrekt erkannt wurde.
Was ich mit dieser Pipeline lösen muss, ist, nur zu haben letztes Ereignis in der Ausgabe.
Ich möchte kein Zeitfenster-Sampling, das beim Ausführen des Programms startet, um es abzutasten und mir das letzte in dieser Zeitspanne zu liefern. Ich denke, das kann man so machen:

Code: Select all

        final Flux buttonStream = stateStream.getButtonFlux()
.mapNotNull(GamepadIntrospector::introspect)
.filter(Predicate.not(List::isEmpty))
.map(EventMapper::translateButtonTimed)
.filter(notFizzy)
.bufferTimeout(3, Duration.ofMillis(300))
.map(e -> e.size() == 1 ?
e.getFirst() : e.getLast())
;
was funktioniert, aber es kommt vor, dass ich „double“ nach „triple“ sehe und außerdem möchte ich nicht, dass jedes Ereignis in der Ausgabe mit 300 ms abgetastet wird. Es vermittelt den Eindruck einer langsamen Reaktion.
Ich möchte, dass diese Pipeline einige Zeit, sagen wir 80 ms, wartet, nachdem das erste Ereignis empfangen wurde, und wenn nichts anderes kommt, gibt sie das Ereignis aus (es wäre bereits mit seiner Multiplizität durch die oben erwähnte Mapper-Komponente festgelegt); Wenn innerhalb dieser Zeitspanne weitere hinzukommen, wird die letzte aus dieser Kette ausgegeben und so weiter.
Nachdem ich also 3x die Taste „A“ gedrückt habe, möchte ich nur noch erhalten

Code: Select all

01:08:10.016 [pool-1-thread-1] INFO org.asmus.Main -- QualifiedEType(type=A, pressType=TRIPLE)
jedoch ohne Pufferung aller 300ms. Die ersten beiden Klicks können in 20 ms + 20 ms erfolgen und der letzte innerhalb dieser 80 ms, sodass nach dem letzten physischen Tastenklick nur 80 ms gewartet werden sollte, bevor das Ereignis ausgegeben wird.
Außerdem muss diese Kette dies tun Berücksichtigen Sie den Schaltflächentyp, daher kann das Timing von QualifiedEType(type=A, pressType=...) QualifiedEType(type=X, pressType=...)
Wie kann das gemacht werden? Ideal wäre eine clevere Flux-Operatorkette, aber alles reicht...
io.projectreactor:reactor-core:3.6.5
Danke!

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post
  • Zeitbasierte Logik der Unit-Tests in Java
    by Anonymous » » in Java
    0 Replies
    13 Views
    Last post by Anonymous