tengo este flujo de datos, más o menos:Java + swing: escribir código para unirse eventos de cambio
DataGenerator -> DataFormatter -> UI
DataGenerator es algo que genera datos con rapidez; DataFormatter es algo que lo formatea con fines de visualización; y la interfaz de usuario es solo un grupo de elementos Swing.
me gustaría hacer mi DataGenerator algo como esto:
class DataGenerator
{
final private PropertyChangeSupport pcs;
...
public void addPropertyChangeListener(PropertyChangeListener pcl) {
this.pcs.addPropertyChangeListener(pcl);
}
public void removePropertyChangeListener(PropertyChangeListener pcl) {
this.pcs.removePropertyChangeListener(pcl);
}
}
y simplemente llamar this.pcs.firePropertyChange(...)
cada vez que mi generador de datos tiene nuevos datos; entonces puedo simplemente hacer dataGenerator.addPropertyListener(listener)
donde listener
es responsable de empujar el cambio hacia el DataFormatter y luego hacia la UI.
El problema con este enfoque es que hay miles de cambios en dataGenerator por segundo (entre 10,000 y 60,000 por segundo dependiendo de mi situación), y el costo computacional de formatearlo para la UI es lo suficientemente alto como para carga innecesaria en mi CPU; Realmente, todo lo que me importa visualmente es un máximo de 10-20 cambios por segundo.
¿Hay alguna manera de utilizar un enfoque similar, pero unir los eventos de cambio antes de que lleguen al DataFormatter? Si recibo múltiples eventos de actualización en un solo tema, me importa mostrar el último y puedo omitir todos los anteriores.
¿Qué tal mantener un valor largo con el System.nanoTime de la última UI- actualizar, e ignorar los eventos de cambio de propiedad si ocurren N ns después de una actualización? – aioobe
Pensé en eso (diablos, 'System.currentTimeMillis()' funcionaría, me importa si las cosas son rápidas en relación con la percepción humana), pero hay un problema. Supongamos que tiene un evento de cambio 100 microsegundos después de una actualización visual, por lo que DataFormatter/UI ignora el cambio. Ahora, por alguna razón, DataGenerator deja de producir actualizaciones (no es necesariamente 10-60K eventos por segundo continuamente). Vaya, te has perdido el cambio más reciente. Eso es malo. –