Ver Mensaje Individual
  #3 (permalink)  
Antiguo 09/05/2011, 20:45
Avatar de HackmanC
HackmanC
 
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Graficas en tiempo real

Hola,

Cita:
Iniciado por sivadmp Ver Mensaje
hola Gonzalo tienes que utilizar Thread o la Interfaz Runnable para crear graficas en tiempo real
...
Técnicamente es mucho mas complejo que simplemente un Thread, recuerda que un Thread cualquiera no puede accesar ninguna función de AWT, porque este último no es multithreading, solamente el EventDispatchThread debe accesar los métodos de AWT.

Código Java:
Ver original
  1. SwingUtilities.invokeLater(new Runnable() {
  2.             public void run() {
  3.                 Thread performer = new Thread(new Runnable() {
  4.                     public void run() {
  5.                         actualizarGrafica();
  6.                     }
  7.                 }, "Performer");
  8.                 performer.start();
  9.             }

Dependiendo de lo que esté dentro de actualizarGrafica, da lo mismo que hacerlo sin un Thread independiente, puesto que invokeLater usa el hilo de EventDispatchThread para ejecutar el contenido del método run, aunque lo haga hasta que tenga tiempo. En otras palabras si en actualizarGrafica hay un ciclo infinito que pinta la imagen conforme se va generando, esta va a bloquear completamente la aplicación para siempre o va a ralentizar la aplicación demasiado tiempo.

Código Java:
Ver original
  1. public void actualizarGraphica() {
  2.   while(true) {
  3.     .. calcSomething ...
  4.     .. drawSomething ...
  5.     // thread consuming all slices of time events
  6.     // of the EventDispatchThread
  7.   }
  8. }

La forma de hacer un aplicación que pinta imágenes y realiza cálculos al mismo tiempo es a través de eventos (Listeners), un hilo hace los cálculos y cuando esté ya tiene parte del resultado genera un evento (fireEvent...) y otro hilo, el EventDispatchThread, está escuchando o esperando por los eventos (addEventListener), porque solamente este debe pintar en la ventana. De esta forma se mantiene la aplicación responsiva a los eventos, se pueden presionar botones y sigue funcionando todo correctamente.

Saludos,

Última edición por HackmanC; 09/05/2011 a las 21:02 Razón: edición