Suchfeld Filter bleibt hängen
-
Hallo,
ich hab im MV 13.1.x (aktuell im 13.1.3) schon mehrfach das Problem gehabt, dass das Textfeld für den Suchfilter rechts oben im Reiter “Filme” hängen bleibt. Das Problem ist nicht leicht reproduzierbar. Meistens klappt es. Aktuell hängt die GUI wieder. Wenn ich den Focus ins Textfeld für die Suche setze, dann kann ich tippen und das Suchergebnis ändert sich (korrekt?). Aber der eingetippte Text wird im Textfeld nicht angezeigt.
Ich hab grad keine Zeit,/Lust mich in den src einzulesen und zu debuggen, möchte aber auf ein Paradigma der GUI Programmierung hinweisen, das hier verletzt sein könnte. Könnt Ihr mal bitte prüfen, ob hier ein klassischer Multithreading-Fehler vorliegt?
Ich weiß aus eigener Erfahrung, daß Java Swing GUIs und C++ MFC GUIs sich bei Verletzung des Paradigmas merkwürdig verhalten mit kaum reproduzierbaren Verhalten. Mein Kollege meinte grad gestern wieder, er habe mit JavaFX dasselbe Problem gehabt.
Kurz gesagt dürfen, und das ist offizielles Paradigma von ORACLE, in Java Swing Updates der Swing-Elemente ausschließlich im Event Dispatch Thread (EDT) erfolgen. Sprich, alles was (aufwendig) rechnet sollte in Threads ausgelagert werden und das Aktualisieren der GUI MUSSSS sich auf den EDT setzen.
Darf man gerne bei ORACLE nachlesen unter https://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.htmlStichworte SwingWorker (für Arbeitsthreads) mit Funktion doInBackGround im Hintergrund-Arbeitsthread bzw Funktionen process und done im EDT um GUISachenMachen.
und Stichwort SwingUtilities.invokeLater(new Runnable…) (Code des Runnable wird garantiert im EDT erfolgen) oder wenn es Spaß macht invokeAndWait, wenn man grad nicht weiß wo man sitzt und sicher gehen will, in den EDT zu kommen.
Ist nix schlimmes, ist mir auch schon oft passiert (erst aus Unwissenheit und dann aus Faulheit), ist für manche schwer zu glauben - aber ich meins nicht arrogant wenn ich sage: issaberso.
Danke für MV und Grüße
K. -
Wenn du Mal ne suche über den Code laufen lässt werden dich aber die Platform.runLater und SwingUtilities.invokeLater förmlich anspringen. Diese werden/müssen regelmäßig genutzt werden. Desweiteren nutze ich für Swing einen thread checking repaint Manager der in der Regel sofort EDT violations für Swing Recht zuverlässig aufzeigt. JavaFX wirft da von Haus aus exceptions.
So gesehen wird es schwer anhand deiner Beschreibung den Fehler zu reproduzieren. Was du aber machen kannst ist das Programm mit -d zu starten. Dann ist der Thread checking repaint Manager aktiv und wirft evtl eine exception auf der CLI die weiter helfen könnte.
Und MFC war/ist die Pest. Das einzige was das wett macht ist die Nutzung von C++
-
Ansonsten Versuche Mal wenn es hängt mit jmap einen dump zu machen
-
Nö, ich werd mich in den src nicht einarbeiten, wie gesagt. Ich glaub Dir auch so, daß Du die EDT-Sache verstanden hast und sie beherzigst. Es roch für mich (ohne src lesen / Ahnung) jedenfalls förmlich nach EDT Problem.
Vorhin ist bei mir mal übrigens das Textfeld für den Suchbegriff komplett aus der GUI verschwunden und kam auch nicht zurück. Vermutlich war das die böse MFC dll aus einer meiner vcredist Installationen, die das Textfield mit der Pest infiziert hat.
Ich habe jedenfalls -d als Aufrufparameter bei meinem Startsymbol angefügt und sehe dann ja, ob der EDT checker anschlägt. Vielleicht habe ich ja Glück und kann einen Stacktrace liefern. Mit genau derselben Methode, den repaint Manager auszutauschen, hab ich selbst schon beste Erfahrungen gemacht. Feine Sache:-)
-
Ähnliches Problem jetzt: es wird zwar getippter Text angezeigt, aber Cursor blinkt nicht da wo tippen sondern immer an derselben Stelle…