java - manejo - ¿Cómo se informa la longitud de la cola de eventos AWT/Swing mediante programación?
java swing tutorial pdf español (1)
Idealmente, la respuesta será independiente de la plataforma, pero específica de la plataforma, particularmente las JVM de Oracle, también son útiles. El proyecto en el que estoy trabajando todavía ejecuta una versión 6 de JVM.
La necesidad particular tiene que ver con una GUI que se "congela" de vez en cuando. Soy muy consciente de que estoy trabajando en GUI en el EDT. El programa funcionaba bien en Windows, pero después de pasar a Linux, estos problemas "extraños" de GUI comenzaron a suceder. En realidad, este problema ha ocurrido en dos aplicaciones, ambas después de un movimiento de Windows a Linux. JVisualVM muestra más de 10 millones de objetos java.awt.EventQueueItem
. La sospecha es que la cola AWT está creciendo más rápido de lo que se sirve en Linux, por lo que la idea es poner un indicador de longitud de cola AWT en la aplicación y ver lo que muestra a medida que la cola crece / se reduce.
Un poco de Google lo encontró, pero hace un escaneo lineal de la cola. Tal vez hay alguna manera mejor?
Materia interesante. Investigué el código de EventQueue un poco, y aunque no he resuelto tu problema, es posible que tenga algunos consejos útiles:
- La implementación de Oracle de EventQueue no mantiene una variable de tamaño, por lo tanto, a menos que usted tome el control completo de EventQueue (vea 3), no hay forma de que vaya a hacer mejor que un escaneo lineal de la cola al usar JRE de Oracle.
- Puedes escribir que eres tu propio EventQueue (probablemente sea más fácil copiar y pegar la implementación de Oracle más algunos ajustes) y usar
EventQueue.push(EventQueue)
para instalar tu propia implementación. Todos los eventos en la cola se transferirán a su cola, para que pueda contarlos a medida que se publican en su cola. Desafortunadamente, esto sigue siendo un escaneo lineal, pero al menos ahora es independiente de la plataforma. - Alternativamente, puede instalar su propia implementación de EventQueue (ver 2) tan pronto como sea posible después de que se haya creado la cola de eventos original (haga esto en un bloque de código estático al comienzo de la clase que contiene su método principal). Luego, su implementación puede contar todos los eventos a medida que se publican y no tiene que escanear la cola cuando desea saber el tamaño. Tendrás que esperar que nadie más empuje su propio EventQueue encima del tuyo;)
** Algunos ajustes: no he probado esto, pero me gustaría quitar todo el código estático público / protegido (cualquiera que haga referencia a esos métodos / variables usa java.awt.EventQueue de todos modos, y tú también), agrega la variable de tamaño y actualiza esta variable en los siguientes cuatro métodos: postEvent(AWTEvent, int)
, getNextEventPrivate()
, getNextEvent(int)
y removeSourceEvent(Object, boolean)
.
Un gran problema con esta modificación es el hecho de que EventQueue realiza algunas llamadas a métodos AWT con visibilidad predeterminada (por ejemplo, Toolkit.getEventQueue()
y Component.getAccessControlContext()
), que no puede llamar dado que su implementación será en un paquete diferente Deberá buscar una solución para cada caso individualmente.