Author Topic: Problemas Thread  (Read 11384 times)

juanpe77

  • Jr. Member
  • **
  • Posts: 57
  • Karma: 0
    • View Profile
Problemas Thread
« on: Febrero 06, 2015, 10:54:01 pm »
Buenas tardes.
Tengo problemas con los thread de java.
A cuasa de mi método timer. Se me activa varias ventanas e incluso se colapsa el programa,porque la ventana se llena de la pantalla de inicio.
Ya he colocado el Toolkit.getDefaultToolkit().addAWTEventListener y continua pasando. ¿Cómo puedo controlar esos threads para que no se activen?
Un saludo.

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5466
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Problemas Thread
« Reply #1 on: Febrero 07, 2015, 02:56:37 am »
Hola:

Imagina que yo estoy haciendo un programa y te digo que tengo un semáforo que hace que se me escriban un montón de ficheros en disco duro y se me peta la memoria. ¿Podrías ayudarme con esas explicaciones? .

Sin ver el código, ni saber exactamente qué significa "se colapsa", ni qué hace el timer, ni qué tiene que ver el addAwtEventListener (salvo que ponía un tiempo a cero), ni de qué threads estás hablando, es complejo darte ninguna ayuda.

Se bueno.

juanpe77

  • Jr. Member
  • **
  • Posts: 57
  • Karma: 0
    • View Profile
Re: Problemas Thread
« Reply #2 on: Febrero 08, 2015, 01:26:04 am »
Te pido disculpas nuevamente. Me explico fatal, no solo en esto,en todo.
Empiezo:
En la ejecución de jframe de la Agenda, dispongo de varios jdialog. Cuando voy a insertar una cita llamo a un jdialog.
Cuando estoy utilizando el jdialog y realizo la agregación de la cita. Va bien todo.
Hasta que para sorpresa para mi,que cuando veo que hay otra ventanas de Inicio de sesión del programa en ejecución.Cuando nunca se ha llegado a cerrar la sesión.
De ahí mi duda si hay alguna forma de controlar los threads en java para que esto no me ocurra.
Método por el cual ocurre esto:

public class AgendaAdmin extends javax.swing.JFrame{

int tiempo=0;
 
public AgendaAdmin(){
timer.start();

//método para controlar la actividad
Toolkit.getDefaultToolkit().addAWTEventListener(
           
        new AWTEventListener() {
       
        @Override
        public void eventDispatched(AWTEvent event) {
         tiempo=0;
        }
    },AWTEvent.WINDOW_FOCUS_EVENT_MASK+AWTEvent.MOUSE_MOTION_EVENT_MASK+AWTEvent.MOUSE_WHEEL_EVENT_MASK+AWTEvent.MOUSE_EVENT_MASK);


}

Timer timer = new Timer(1000, new ActionListener() {
        @Override
     
   
        public void actionPerformed(ActionEvent e) {
           
           createAwtListener();
           
           tiempo++;

            if (tiempo == 60) {//60 segundos

                //lo que sucede a los 60 segundos
               
                timer.stop();
               
               
               
                ll.setVisible(true); //no hace falta, con el main del login ya lo despliega
               
                ll=null;
               
                timer=null;
               
                CA=null;
               
                agregarcita.dispose();
               
                cobrotatuaje.dispose();
               
                tecladoletras.dispose();
               
                tecladonumeros.dispose();
               
                filechooser.dispose();
               
                AlmacenarDatos AD = new AlmacenarDatos(nombreusuario,datos,AgendaAdmin.this);
               
                Runtime runtime = Runtime.getRuntime();
   
                runtime.gc();
   
                runtime.runFinalization();
               
                //debemos cerrar todos los jdialog y el jframe principal
               
                dispose();

            }

        }

    });
}
No sé si me entenderán ahora. Una vez más,disculpar las molestias.
Un saludo.

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5466
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Problemas Thread
« Reply #3 on: Febrero 08, 2015, 04:34:57 am »
¿Y dónde abres una ventana de inicio de sesión? ¿Y dónde están esos threads de los que hablas?

Se bueno.

juanpe77

  • Jr. Member
  • **
  • Posts: 57
  • Karma: 0
    • View Profile
Re: Problemas Thread
« Reply #4 on: Febrero 15, 2015, 10:10:43 am »
Buenas noches.
Perdona la tardanza por contestar tan tarde.
Te adjunto unas capturas de pantalla de lo que me sucede.
En la función Timer, tengo puesto un timer.stop() para que concluya ese método pero ni así deja de funcionar.
Tengo puesto este método en el constructor de la clase:
Toolkit.getDefaultToolkit().addAWTEventListener(
           
        new AWTEventListener() {
       
        @Override
        public void eventDispatched(AWTEvent event) {
       tiempo=0;
        }
    },AWTEvent.WINDOW_FOCUS_EVENT_MASK+AWTEvent.MOUSE_MOTION_EVENT_MASK+AWTEvent.MOUSE_WHEEL_EVENT_MASK+AWTEvent.MOUSE_EVENT_MASK);

A ver si pudieras entender lo que me sucede.
No logro comprender dónde está el fallo.
Gracias de antemano por su tiempo.
Un saludo.

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5466
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Problemas Thread
« Reply #5 on: Febrero 15, 2015, 05:57:47 pm »
¿Y dónde está tiempo definido?. Si no te funciona, tiene toda la pinta de que tienes dos variables tiempo distintas definidas. Por eso una de las primeras preguntas que te hice en el otro post http://foro.chuidiang.com/java-j2se/problema-con-jfilechooser/msg18178/#msg18178 . Si el timer tal cual me muestras el código y el addAwtEventListener tal cual me muestras el código están en la misma clase, posiblemente comparten la variable tiempo. Pero si son clases distintas, son dos tiempo distinto.

Si siendo la misma clase no te funciona, posiblemente tienes dos variables tiempo distintas definidas. ¿dónde declaras esa variable? ¿La recibes como parámetro en algún sitio?

Pon system.out tanto en el timer como en el awteventlistener para sacar el valor de la variable tiempo, así verás si es la misma o no.

Se bueno.

juanpe77

  • Jr. Member
  • **
  • Posts: 57
  • Karma: 0
    • View Profile
Re: Problemas Thread
« Reply #6 on: Febrero 16, 2015, 02:00:07 am »
La variable tiempo es una variable global definida en cada clase como:
int tiempo=0;
Adjunto una imagen. Si es una variable global debería afectarle los diferentes métodos que en ella es afectada.
No hago más con dicha variable. No entiendo porque ocurre esto.
Un saludo.

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5466
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Problemas Thread
« Reply #7 on: Febrero 16, 2015, 02:57:05 am »
" una variable global definida en cada clase" . ¿En cuántas clases está definida?

Pon el system.out que te he dicho en ambos sitios y verifica si es la misma variable viendo que los valores que cambias en un lado se reflejan en el otro.

Se bueno.

juanpe77

  • Jr. Member
  • **
  • Posts: 57
  • Karma: 0
    • View Profile
Re: Problemas Thread
« Reply #8 on: Febrero 16, 2015, 06:51:24 am »
Resultado de lo que me sugieres que imprima, te lo adjunto en las imágenes.
Y este es el código que uso en todas las clases excepto la principal que no lo tiene:
public class ejemplo extends javax.swing.JFrame {

    int tiempo=0;
   
    public ejemplo() {
        initComponents();

        timer.start();

        Toolkit.getDefaultToolkit().addAWTEventListener(
           
        new AWTEventListener() {
       
        @Override
        public void eventDispatched(AWTEvent event) {
            System.out.println(tiempo);
       tiempo=0;
        }
    },AWTEvent.WINDOW_FOCUS_EVENT_MASK+AWTEvent.MOUSE_MOTION_EVENT_MASK+AWTEvent.MOUSE_WHEEL_EVENT_MASK+AWTEvent.MOUSE_EVENT_MASK);
       
    }

    Timer timer = new Timer (1000, new ActionListener ()
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        tiempo++;

        System.out.println(tiempo);
       
if(tiempo == 60){//60 segundos

        //lo que sucede a los 60 segundos
   
    System.out.println(tiempo);
    timer.stop();
   
   
    Login l = new Login();
     
    l.setVisible(true);
   
    l=null;
   
    timer=null;
   
    Runtime runtime = Runtime.getRuntime();
   
    runtime.gc();
   
    runtime.runFinalization();
   
    dispose();
 
     }

    }     
   
   
    });
}

Si te fijas al final de la imagen 2 imprime tres veces 60 y varias veces 0. Cuando ya ha entrado en la condición if del método Timer y ya está en la otra clase.
¿Qué ocurre aquí? ¿Porque sigue entrando en esa condición if?
Un saludo.
« Last Edit: Febrero 16, 2015, 09:13:51 am by juanpe77 »

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5466
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Problemas Thread
« Reply #9 on: Febrero 16, 2015, 02:54:34 pm »
"ya está en la otra clase..." ¿Cómo se llaman las clases donde tienes estos dos trozos de código?

Se bueno.

juanpe77

  • Jr. Member
  • **
  • Posts: 57
  • Karma: 0
    • View Profile
Re: Problemas Thread
« Reply #10 on: Febrero 16, 2015, 04:56:54 pm »
La otra clase,es la clase de Inicio a la que llamo dentro de la función:

Timer timer = new Timer (1000, new ActionListener ()
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        tiempo++;//aumento la variable tiempo cuando está inactivo

        System.out.println(tiempo);
       
if(tiempo == 60){//60 segundos

        //lo que sucede a los 60 segundos
   
    System.out.println(tiempo);
    timer.stop();//paro el thread timer
    Login l = new Login();//Instancia clase de inicio
    l.setVisible(true);//Hago visible el jframe
   
    //los pongo null para luego llamar al recolector de basura y quitar las referencias
    l=null;
    timer=null;
    Runtime runtime = Runtime.getRuntime();
    runtime.gc();
    runtime.runFinalization();
    dispose();//salgo de la clase en la que estamos
     }
    }   
    });
}
Todas estos métodos van en las demás clases que tengo en el programa.
¿Qué puede ser para que una vez que esté en la clase de inicio continúe ejecutandose estos métodos?
Un saludo.

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5466
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Problemas Thread
« Reply #11 on: Febrero 16, 2015, 06:05:47 pm »
Insisto, no me estás contestando a la pregunta principal. "Todas estos métodos van en las demás clases"   ¡¡ ¿¿ En cuantas clases distintas va ese trozo de código que me pegas una y otra vez ?? !!

Y si va en una sola clase ... ¿¿¿ Cuántos news haces de esa clase ??? Veo un dispose....

juanpe77

  • Jr. Member
  • **
  • Posts: 57
  • Karma: 0
    • View Profile
Re: Problemas Thread
« Reply #12 on: Febrero 16, 2015, 10:43:10 pm »
Sí,todos estos métodos van en cada clase excepto la del Inicio.
Hago un solo new de la clase de Inicio en la clase Timer. Y el dispose lo pongo para cerrar la clase que se ha quedado inactiva.
No hago nuevas instancias a esa clase.

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5466
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Problemas Thread
« Reply #13 on: Febrero 16, 2015, 10:47:28 pm »
Vuelvo a repetir la pregunta:

"todos estos métodos van en cada clase"   ¿Cuántas clases? ¿Cuales? ¿Qué va en cada clase?

Si, ya se que en la de Inicio no va, ya me lo has dicho antes, sigues sin contestar a la pregunta.

Y me refiero a cuántos news haces de esas otras clases que NO son la de Inicio.

PD: Olvidate de la clase de Inicio, ya me has dicho que solo haces un new y que no lleva ese codigo. Me interesan las otras clases.

Se bueno.

juanpe77

  • Jr. Member
  • **
  • Posts: 57
  • Karma: 0
    • View Profile
Re: Problemas Thread
« Reply #14 on: Febrero 16, 2015, 11:25:56 pm »
De acuerdo,te explico el procedimiento que realizado.
Iniciamos el programa. Logeamos y dependiendo del usuario, se muestra una clase u otra.
Estas clases llevan esos métodos que te he descrito anteriormente.El mismo código,exactamente lo mismo.
En dichas clases  puedes acceder a diferentes clases según la elección del usuario(son botones que les muestro por pantalla y eligen). Esas clases también llevan esos métodos.
Te escribo el código para llamar a una de esas clases:
private void cobroadminActionPerformed(java.awt.event.ActionEvent evt) {                                           
       timer.stop();
       
        CobroAdmin CA = new CobroAdmin(nombreusuario,idusuario);
       
        CA.setVisible(true);
       
        CA=null;
       
        timer=null;
       
        Runtime runtime = Runtime.getRuntime();
   
        runtime.gc();
   
        runtime.runFinalization();
       
        dispose();
       
       
    }     
Hago exactamente lo mismo para las demás clases.
Un saludo.

 

ey