Foros del Web » Programación para mayores de 30 ;) » Java »

hilos, progressMonitor

Estas en el tema de hilos, progressMonitor en el foro de Java en Foros del Web. A ver, no puede ser tan dificil, jeje, pero yo soy incapaz. Quiero implantar una barra de progreso, logicamente para que tanto la barra como ...
  #1 (permalink)  
Antiguo 14/04/2011, 12:17
 
Fecha de Ingreso: marzo-2009
Ubicación: Salamanca, España
Mensajes: 141
Antigüedad: 15 años, 1 mes
Puntos: 4
hilos, progressMonitor

A ver, no puede ser tan dificil, jeje, pero yo soy incapaz.

Quiero implantar una barra de progreso, logicamente para que tanto la barra como la aplicacion funcionen a la vez necesito trabajar con hilos, en un hilo se realizaran los calculos, y en el otro hilo se mostrara la evolucion con una barra.

Supongamos que cuando se pulsa el boton enviar en el hilo principal se recorre un bucle for de 1 a 100, en ese momento debe crearse un hilo que me muestra la evolucion de la operacion en una barra.

Como el progreso de la barra depende del bucle que se esta ejecutando en el principal deberia pasarle ese valor "i" para que me pueda pintar el porcentaje correcto.

Como implemento esto???

Este seria el codigo para la ventana principal, se pulsa boton y se inicia el bucle for

Código Javascript:
Ver original
  1. [SIZE="2"]import java.awt.BorderLayout;
  2. import java.awt.FlowLayout;
  3. import java.awt.GridBagConstraints;
  4. import java.awt.GridBagLayout;
  5. import java.awt.Insets;
  6. import java.awt.event.ActionEvent;
  7. import java.awt.event.ActionListener;
  8. import javax.swing.JButton;
  9. import javax.swing.JDialog;
  10. import javax.swing.JFrame;
  11. import javax.swing.JLabel;
  12. import javax.swing.JProgressBar;
  13. import javax.swing.WindowConstants;
  14.  
  15.  
  16. public class Main2
  17. {
  18.  
  19.     /** La ventana */
  20.     private JFrame v;
  21.    
  22.     /** El botón */
  23.     private JButton b;
  24.    
  25.     public static void main(String [] args)
  26.     {
  27.         new Main2();
  28.     }
  29.    
  30.     /**
  31.      * Crea la ventana, inicializa todo y la visualiza
  32.      */
  33.     public Main2()
  34.     {
  35.         // Nueva ventana. Se el pone un FlowLayout para que el botón y campo
  36.         // de texto quede alineados.
  37.         v = new JFrame("Version Beta Transmision");
  38.         GridBagLayout vLayout = new GridBagLayout();
  39.         v.getContentPane().setLayout(vLayout);
  40.         vLayout.rowWeights = new double[] {0.1, 0.1, 0.1, 0.1, 0.1};
  41.         vLayout.rowHeights = new int[] {7, 7, 7, 7, 7};
  42.         vLayout.columnWeights = new double[] {0.1, 0.0, 0.1, 0.1};
  43.         vLayout.columnWidths = new int[] {7, 129, 7, 7};
  44.      
  45.         // Se crea el botón y se mete en la ventana
  46.         b = new JButton("Enviar");
  47.         v.getContentPane().add(b, new GridBagConstraints(3, 4, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
  48.              
  49.         // Se le dice al botón qué tiene que hacer cuando lo pulsemos.
  50.         b.addActionListener(new ActionListener()
  51.         {
  52.  
  53.             public void actionPerformed(ActionEvent e)
  54.             {                              
  55.                 for(int i=0;i<100;i++){
  56.                     //mihilo.resultado(i);
  57.                     System.out.println("Progreso:" +i);
  58.                    
  59.                 }
  60.                
  61.             }
  62.         });
  63.        
  64.         // Se le dice a la ventana que termine el programa cuando se la cierre
  65.         v.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  66.        
  67.         // Se le da un tamaño automático a la ventana para que quepa todo su
  68.         // contenido.
  69.         v.pack();
  70.         v.setSize(764, 365);
  71.  
  72.         // Se hace visible la ventana
  73.         v.setVisible(true);
  74.     }
  75.    
  76.    
  77. }[/SIZE]

Ahora necesito crear un hilo cuando se pulse el boton y mandarle ese parametro "i" del bucle para informar a la barra del progreso y asi la pinte
  #2 (permalink)  
Antiguo 14/04/2011, 12:50
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: hilos, progressMonitor

Pregunta ¿para qué necesitas mandar parámetros entre hilos?

Aparentemente no tienes problemas de concurrencia, usa una variable static.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #3 (permalink)  
Antiguo 14/04/2011, 12:55
 
Fecha de Ingreso: marzo-2009
Ubicación: Salamanca, España
Mensajes: 141
Antigüedad: 15 años, 1 mes
Puntos: 4
Respuesta: hilos, progressMonitor

Hola Xerelo, estaba justo editando el tema cuando me contestaste xq creo que de esta manera se ve mejor lo que me pasa.

En el ventana principal dispongo de un boton que al pulsarlo inicia un bucle cuyo resultado lo ha de mostrar por consola, a la vez, se debe crear un hilo donde se ejecutara otro bucle y cuyo resultado se muestre en una nueva ventana.

Ambos hilos por separado funcionan perfectamente, pero al juntarlos algo pasa que no corre bien la aplicacion.

Veamos el codigo:

En este caso, una ventana y un boton, al pulsarlo se inicia un bucle y se muestra por consola:

Código Javascript:
Ver original
  1. import java.awt.BorderLayout;
  2. import java.awt.FlowLayout;
  3. import java.awt.GridBagConstraints;
  4. import java.awt.GridBagLayout;
  5. import java.awt.Insets;
  6. import java.awt.event.ActionEvent;
  7. import java.awt.event.ActionListener;
  8. import javax.swing.JButton;
  9. import javax.swing.JDialog;
  10. import javax.swing.JFrame;
  11. import javax.swing.JLabel;
  12. import javax.swing.JProgressBar;
  13. import javax.swing.WindowConstants;
  14.  
  15. public class Main2 {
  16.  
  17.     /** La ventana */
  18.     private JFrame v;
  19.  
  20.     /** El botón */
  21.     private JButton b;
  22.  
  23.     public static void main(String[] args) {
  24.         new Main2();
  25.     }
  26.  
  27.     /**
  28.      * Crea la ventana, inicializa todo y la visualiza
  29.      */
  30.     public Main2() {
  31.         // Nueva ventana. Se el pone un FlowLayout para que el botón y campo
  32.         // de texto quede alineados.
  33.         v = new JFrame("Version Beta Transmision");
  34.         GridBagLayout vLayout = new GridBagLayout();
  35.         v.getContentPane().setLayout(vLayout);
  36.         vLayout.rowWeights = new double[] { 0.1, 0.1, 0.1, 0.1, 0.1 };
  37.         vLayout.rowHeights = new int[] { 7, 7, 7, 7, 7 };
  38.         vLayout.columnWeights = new double[] { 0.1, 0.0, 0.1, 0.1 };
  39.         vLayout.columnWidths = new int[] { 7, 129, 7, 7 };
  40.  
  41.         // Se crea el botón y se mete en la ventana
  42.         b = new JButton("Enviar");
  43.         v.getContentPane().add(
  44.                 b,
  45.                 new GridBagConstraints(3, 4, 1, 1, 0.0, 0.0,
  46.                         GridBagConstraints.CENTER, GridBagConstraints.NONE,
  47.                         new Insets(0, 0, 0, 0), 0, 0));
  48.  
  49.         // Se le dice al botón qué tiene que hacer cuando lo pulsemos.
  50.         b.addActionListener(new ActionListener() {
  51.  
  52.             public void actionPerformed(ActionEvent e) {
  53.  
  54.                 int i = 0;
  55.                 while (true) {
  56.                     System.out.println("Valor: " + i);
  57.                     i++;
  58.                 }
  59.  
  60.             }
  61.         });
  62.  
  63.         // Se le dice a la ventana que termine el programa cuando se la cierre
  64.         v.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  65.  
  66.         // Se le da un tamaño automático a la ventana para que quepa todo su
  67.         // contenido.
  68.         v.pack();
  69.         v.setSize(764, 365);
  70.  
  71.         // Se hace visible la ventana
  72.         v.setVisible(true);
  73.     }
  74.  
  75. }

Ahora, al pulsar el boton, se crea un nuevo hilo que muestra un bucle en una nueva ventana:

Código Javascript:
Ver original
  1. import java.awt.BorderLayout;
  2. import java.awt.FlowLayout;
  3. import java.awt.GridBagConstraints;
  4. import java.awt.GridBagLayout;
  5. import java.awt.Insets;
  6. import java.awt.event.ActionEvent;
  7. import java.awt.event.ActionListener;
  8. import javax.swing.JButton;
  9. import javax.swing.JDialog;
  10. import javax.swing.JFrame;
  11. import javax.swing.JLabel;
  12. import javax.swing.JProgressBar;
  13. import javax.swing.WindowConstants;
  14.  
  15. public class Main2 {
  16.  
  17.     /** La ventana */
  18.     private JFrame v;
  19.  
  20.     /** El botón */
  21.     private JButton b;
  22.  
  23.     public static void main(String[] args) {
  24.         new Main2();
  25.     }
  26.  
  27.     /**
  28.      * Crea la ventana, inicializa todo y la visualiza
  29.      */
  30.     public Main2() {
  31.         // Nueva ventana. Se el pone un FlowLayout para que el botón y campo
  32.         // de texto quede alineados.
  33.         v = new JFrame("Version Beta Transmision");
  34.         GridBagLayout vLayout = new GridBagLayout();
  35.         v.getContentPane().setLayout(vLayout);
  36.         vLayout.rowWeights = new double[] { 0.1, 0.1, 0.1, 0.1, 0.1 };
  37.         vLayout.rowHeights = new int[] { 7, 7, 7, 7, 7 };
  38.         vLayout.columnWeights = new double[] { 0.1, 0.0, 0.1, 0.1 };
  39.         vLayout.columnWidths = new int[] { 7, 129, 7, 7 };
  40.  
  41.         // Se crea el botón y se mete en la ventana
  42.         b = new JButton("Enviar");
  43.         v.getContentPane().add(
  44.                 b,
  45.                 new GridBagConstraints(3, 4, 1, 1, 0.0, 0.0,
  46.                         GridBagConstraints.CENTER, GridBagConstraints.NONE,
  47.                         new Insets(0, 0, 0, 0), 0, 0));
  48.  
  49.         // Se le dice al botón qué tiene que hacer cuando lo pulsemos.
  50.         b.addActionListener(new ActionListener() {
  51.  
  52.             public void actionPerformed(ActionEvent e) {
  53.  
  54.                 v.setVisible(false);
  55.                 Hilo t = new Hilo();
  56.                 t.start();
  57.  
  58.             }
  59.         });
  60.  
  61.         // Se le dice a la ventana que termine el programa cuando se la cierre
  62.         v.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  63.  
  64.         // Se le da un tamaño automático a la ventana para que quepa todo su
  65.         // contenido.
  66.         v.pack();
  67.         v.setSize(764, 365);
  68.  
  69.         // Se hace visible la ventana
  70.         v.setVisible(true);
  71.     }
  72.  
  73. }

El codigo del hilo es este:
Código Javascript:
Ver original
  1. import java.awt.BorderLayout;
  2.  
  3. import javax.swing.JDialog;
  4. import javax.swing.JFrame;
  5. import javax.swing.JLabel;
  6. import javax.swing.JProgressBar;
  7.  
  8. public class Hilo extends Thread{
  9.    
  10.     public void run() {
  11.       JFrame parentFrame = new JFrame();
  12.             parentFrame.setSize(500, 150);
  13.             JLabel jl = new JLabel();
  14.             jl.setText("Contando : 0");
  15.  
  16.             parentFrame.add(BorderLayout.CENTER, jl);
  17.             parentFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  18.  
  19.             parentFrame.setVisible(true);
  20.  
  21.           int i =0;  
  22.       while(true){
  23.               jl.setText("Contando : " + i);
  24.               i++;
  25.       }
  26.                
  27.     }
  28. }

Y ahora lo que no funcina, las dos cosas a la vez :(
Código Javascript:
Ver original
  1. import java.awt.BorderLayout;
  2. import java.awt.FlowLayout;
  3. import java.awt.GridBagConstraints;
  4. import java.awt.GridBagLayout;
  5. import java.awt.Insets;
  6. import java.awt.event.ActionEvent;
  7. import java.awt.event.ActionListener;
  8. import javax.swing.JButton;
  9. import javax.swing.JDialog;
  10. import javax.swing.JFrame;
  11. import javax.swing.JLabel;
  12. import javax.swing.JProgressBar;
  13. import javax.swing.WindowConstants;
  14.  
  15. public class Main2 {
  16.  
  17.     /** La ventana */
  18.     private JFrame v;
  19.  
  20.     /** El botón */
  21.     private JButton b;
  22.  
  23.     public static void main(String[] args) {
  24.         new Main2();
  25.     }
  26.  
  27.     /**
  28.      * Crea la ventana, inicializa todo y la visualiza
  29.      */
  30.     public Main2() {
  31.         // Nueva ventana. Se el pone un FlowLayout para que el botón y campo
  32.         // de texto quede alineados.
  33.         v = new JFrame("Version Beta Transmision");
  34.         GridBagLayout vLayout = new GridBagLayout();
  35.         v.getContentPane().setLayout(vLayout);
  36.         vLayout.rowWeights = new double[] { 0.1, 0.1, 0.1, 0.1, 0.1 };
  37.         vLayout.rowHeights = new int[] { 7, 7, 7, 7, 7 };
  38.         vLayout.columnWeights = new double[] { 0.1, 0.0, 0.1, 0.1 };
  39.         vLayout.columnWidths = new int[] { 7, 129, 7, 7 };
  40.  
  41.         // Se crea el botón y se mete en la ventana
  42.         b = new JButton("Enviar");
  43.         v.getContentPane().add(
  44.                 b,
  45.                 new GridBagConstraints(3, 4, 1, 1, 0.0, 0.0,
  46.                         GridBagConstraints.CENTER, GridBagConstraints.NONE,
  47.                         new Insets(0, 0, 0, 0), 0, 0));
  48.  
  49.         // Se le dice al botón qué tiene que hacer cuando lo pulsemos.
  50.         b.addActionListener(new ActionListener() {
  51.  
  52.             public void actionPerformed(ActionEvent e) {
  53.  
  54.                 v.setVisible(false);
  55.                 Hilo t = new Hilo();
  56.                 t.start();
  57.  
  58.                 int i = 0;
  59.                 while (true) {
  60.                     System.out.println("Valor: " + i);
  61.                     i++;
  62.                 }
  63.  
  64.             }
  65.         });
  66.  
  67.         // Se le dice a la ventana que termine el programa cuando se la cierre
  68.         v.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  69.  
  70.         // Se le da un tamaño automático a la ventana para que quepa todo su
  71.         // contenido.
  72.         v.pack();
  73.         v.setSize(764, 365);
  74.  
  75.         // Se hace visible la ventana
  76.         v.setVisible(true);
  77.     }
  78.  
  79. }
  #4 (permalink)  
Antiguo 14/04/2011, 13:19
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: hilos, progressMonitor

Entre que son unas cuantas líneas de código y que yo de aplicaciones de escritorio más bien poco, sólo lo he mirado por encima.

Creo que no estás planteando correctamente cuándo detener los hilos.

Lanzas un hilo con un bucle infinito (personalmente eso no me gusta nada) mientras en el main lanzas otro bucle infinito. ¿Cómo esperas que cualquiera de los dos salga del bucle?
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #5 (permalink)  
Antiguo 14/04/2011, 13:34
 
Fecha de Ingreso: marzo-2009
Ubicación: Salamanca, España
Mensajes: 141
Antigüedad: 15 años, 1 mes
Puntos: 4
Respuesta: hilos, progressMonitor

Lo de los bucles infinitos es solo para ver como se ejecutan tareas largas en ambos hilos y asi poder analizar el proceso.

Lo que me escama es q por separado funcione bien, y al juntarlo pasen cosas raras
  #6 (permalink)  
Antiguo 14/04/2011, 13:44
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: hilos, progressMonitor

Cita:
Lo que me escama es q por separado funcione bien, y al juntarlo pasen cosas raras
Define cosas raras.

Por lo que veo debería aparecer millones de veces líneas de "contando" y "valor", pero no tienen por qué alternar 1 y 1 perfectamente.

Si quieres verlo en condiciones, mete un sleep entre cada salida por consola, y usa un for, no un bucle infinito.

http://download.oracle.com/javase/1....long,%20int%29
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #7 (permalink)  
Antiguo 14/04/2011, 14:37
 
Fecha de Ingreso: marzo-2009
Ubicación: Salamanca, España
Mensajes: 141
Antigüedad: 15 años, 1 mes
Puntos: 4
Respuesta: hilos, progressMonitor

Xerelo, para que te hagas una idea, cuando se abre la segunda ventana se queda como transparente, mientras que el bucle en consola funciona bien. Te muestro una captura de pantalla por si no puedes ejecutar el codigo.

Eso si, si el bucle tuviese un fin, cuandoeste terminase, la ventana dejaria de ser transparente para mostrar el ultimo valor.

http://img703.imageshack.us/i/capturaqgd.jpg/
  #8 (permalink)  
Antiguo 15/04/2011, 11:55
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: hilos, progressMonitor

Cita:
cuando se abre la segunda ventana se queda como transparente, mientras que el bucle en consola funciona bien.
Si el bucle funciona bien (sigo sin saber como pretendes terminarlos) tu problema está en que no manejas bien el repintado (o como se diga) del JFrame.

Vamos, que creo que no es un problema de hilos, sino de JFrames. Busca información sobre el paint(), repaint() y no sé si algún otro método.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.

Etiquetas: hilos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:32.