elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Mi SwingWorker no se cancela
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Mi SwingWorker no se cancela  (Leído 5,262 veces)
Zoik

Desconectado Desconectado

Mensajes: 91


Ver Perfil
Mi SwingWorker no se cancela
« en: 29 Agosto 2013, 10:07 am »

Bien estoy puliendo una aplicación de shutdown y me e quedado atascado en un lugar.

Tengo el siguiente método que recoge los eventos de dos botones, cuando le doy a programar el apagado me inicia la variable time cogiendome los valores de tres JComboBox, time, es un SwingWorker que revisa la hora, supuestamente cuando yo le diese a cancelar, con el comando time.cancel(true) me tendría que detener el thread, pero no es así:

Código
  1. public void actionPerformed(ActionEvent evt) {
  2. CheckTime time = new CheckTime(hour.getSelectedIndex(), min.getSelectedIndex(), sec.getSelectedIndex());
  3. if(evt.getSource() == programShutdown && isStarted == false){
  4. System.out.println("iniciado!");
  5. time.execute();
  6. isStarted = true;
  7. } else if(evt.getSource() == cancelShutdown && isStarted == true){
  8. System.out.println("cancelado!");
  9. time.cancel(true);
  10. isStarted = false;
  11. }
  12.  
  13. }

Código
  1. package base;
  2.  
  3. import java.util.Calendar;
  4.  
  5. import javax.swing.SwingWorker;
  6.  
  7. public class CheckTime extends SwingWorker{
  8. private int copyHour;
  9. private int copyMin;
  10. private int copySec;
  11. public  CheckTime(int hour,int min, int sec){
  12. copyHour = hour;
  13. copyMin = min;
  14. copySec = sec;
  15. }
  16.  
  17. protected Object doInBackground() throws Exception {
  18. Calendar calendario;
  19. int thisHour;
  20. int thisMin;
  21. int thisSec;
  22. System.out.println("iniciado!");
  23. do{
  24. calendario = Calendar.getInstance();
  25. thisHour = calendario.get(Calendar.HOUR_OF_DAY);
  26. thisMin = calendario.get(Calendar.MINUTE);
  27. thisSec = calendario.get(Calendar.SECOND);
  28. try {
  29. Thread.sleep(1000);
  30. } catch (InterruptedException e) {
  31. System.out.println("Thread sleep de ChekcHour a fallado");
  32. }
  33. }while(copyHour != thisHour || copyMin != thisMin || copySec != thisSec);
  34. System.out.println("APAGATE!");
  35. return null;
  36. }
  37.  
  38. }
  39.  

Sospecho que puede ser, que como yo genero un new time, cada vez que le de o a cancel o a programar, al darle a cancel me cancela el que genera cancel, pero no el anterior que genere con el program, pero bueno quiero escuchar segundas opiniones.

Un saludo y gracias de antemano.


En línea

Fakedo0r

Desconectado Desconectado

Mensajes: 21


Fuera de compás, en una de las 12 dimensiones...


Ver Perfil WWW
Re: Mi SwingWorker no se cancela
« Respuesta #1 en: 29 Agosto 2013, 12:07 pm »

Hola, estoy en el trabajo y no puedo probar el código pero prueba así a ver si te funciona.

Código
  1. package base;
  2.  
  3. import java.util.Calendar;
  4.  
  5. import javax.swing.SwingWorker;
  6.  
  7. public class CheckTime extends SwingWorker{
  8.  
  9. private int copyHour;
  10. private int copyMin;
  11. private int copySec;
  12. private boolean running;
  13.  
  14. public  CheckTime(int hour,int min, int sec){
  15. copyHour = hour;
  16. copyMin = min;
  17. copySec = sec;
  18. }
  19.  
  20. protected Object doInBackground() throws Exception {
  21. Calendar calendario;
  22. int thisHour;
  23. int thisMin;
  24. int thisSec;
  25.  
  26. System.out.println("iniciado!");
  27. this.running = true;
  28.  
  29. do{
  30. calendario = Calendar.getInstance();
  31. thisHour = calendario.get(Calendar.HOUR_OF_DAY);
  32. thisMin = calendario.get(Calendar.MINUTE);
  33. thisSec = calendario.get(Calendar.SECOND);
  34. try {
  35. Thread.sleep(1000);
  36. } catch (InterruptedException e) {
  37. System.out.println("Thread sleep de ChekcHour a fallado");
  38. }
  39. }while(copyHour != thisHour || copyMin != thisMin || copySec != thisSec || this.running);
  40. System.out.println("APAGATE!");
  41. return null;
  42. }
  43.  
  44. public void stopThread() {
  45. running = false;
  46. }


Código
  1. public void actionPerformed(ActionEvent evt) {
  2. CheckTime time = new CheckTime(hour.getSelectedIndex(), min.getSelectedIndex(), sec.getSelectedIndex());
  3. if(evt.getSource() == programShutdown && isStarted == false){
  4. System.out.println("iniciado!");
  5. time.execute();
  6. isStarted = true;
  7. } else if(evt.getSource() == cancelShutdown && isStarted == true){
  8. System.out.println("cancelado!");
  9. time.stopThread();
  10. isStarted = false;
  11. }
  12.  
  13. }

Si algo, comenta.

Saludos.


« Última modificación: 29 Agosto 2013, 14:35 pm por Fakedo0r » En línea

Zoik

Desconectado Desconectado

Mensajes: 91


Ver Perfil
Re: Mi SwingWorker no se cancela
« Respuesta #2 en: 29 Agosto 2013, 13:44 pm »

Bueno si no te importa e hecho unos cambios ya que si no nunca salia del bucle al llegar la hora, así cuando llega a la hora si que sale del bucle y "apaga el ordenador", pero e estado observando la variable running, y aún cambiandola desde el método, parece que el SwingWorker la sigue teniendo en true.

Código
  1. package base;
  2.  
  3. import java.util.Calendar;
  4.  
  5. import javax.swing.SwingWorker;
  6.  
  7. public class CheckTime extends SwingWorker{
  8. private int copyHour;
  9. private int copyMin;
  10. private int copySec;
  11. private boolean running;
  12. public  CheckTime(int hour,int min, int sec){
  13. copyHour = hour;
  14. copyMin = min;
  15. copySec = sec;
  16. }
  17.  
  18. protected Object doInBackground() throws Exception {
  19. Calendar calendario;
  20. int thisHour;
  21. int thisMin;
  22. int thisSec;
  23. System.out.println("iniciado!");
  24. this.running = true;
  25.  
  26. do{
  27. calendario = Calendar.getInstance();
  28. thisHour = calendario.get(Calendar.HOUR_OF_DAY);
  29. thisMin = calendario.get(Calendar.MINUTE);
  30. thisSec = calendario.get(Calendar.SECOND);
  31. try {
  32. Thread.sleep(1000);
  33. } catch (InterruptedException e) {
  34. System.out.println("Thread sleep de ChekcHour a fallado");
  35. }
  36. System.out.println(running);
  37. if(this.running == false){
  38. System.out.println("E cancelado el thread");
  39. }
  40. }while(copyHour != thisHour || copyMin != thisMin || copySec != thisSec);
  41. System.out.println("APAGATE!");
  42. return null;
  43. }
  44.  
  45. public void stopThread() {
  46. System.out.println("Estoy en stop y e puesto running a false");
  47. running = false;
  48. System.out.println("running = "+running);
  49. }
  50.  
  51. }

Me explicaré mejor, enciendo el thread y en el bucle va printando true, el thread está encendido, le doy a cancelar, y en un println en el método de cancelar, veo como se cambia el valor de running, pero en el bucle que aún esta en marcha, continua printando true.

Un saludo y gracias.
En línea

Fakedo0r

Desconectado Desconectado

Mensajes: 21


Fuera de compás, en una de las 12 dimensiones...


Ver Perfil WWW
Re: Mi SwingWorker no se cancela
« Respuesta #3 en: 29 Agosto 2013, 14:32 pm »

Hola, veo que no sabes trabajar con hilos. Ese código que has modificado esta mal ya que jamas saldrá del bucle aunque mandes la orden de terminar el hilo si no se cumple una de las 3 condiciones que has puesto. Por eso tenia la variable "running" como una condición más, para que en caso de que el valor del "running" fuera falsa, pues se rompiera el bucle. Prueba el que te puse y ponte a leer sobre los hilos si quieres aprender a manejar-los.

PD: Ahora que veo tenía un pequeño fallo en el código y por eso no funcionaba. Ya lo modifique.

Tenia puesto así:

Código
  1. public void stopThread() {
  2.  running == false;
  3. }

Pero es así:

Código
  1. public void stopThread() {
  2.  running = false;
  3. }
  4.  

Ya que "==" es para comparar y no setear el valor.

Saludos.
« Última modificación: 29 Agosto 2013, 14:40 pm por Fakedo0r » En línea

Zoik

Desconectado Desconectado

Mensajes: 91


Ver Perfil
Re: Mi SwingWorker no se cancela
« Respuesta #4 en: 29 Agosto 2013, 14:41 pm »

Ciertamente nunca saldrá, pero ahora mismo acabo de copiar y pegar tu código, cuando llega la hora que e asigando en los jcombobox tendría que salir del bucle y printar apagate, y no me lo printa, es decir que no sale del bucle, y al darle a cacelar estoy en las mismas tampoco me sale.

En el que hice almenos me apagaba el ordenador, agradecería que me explicases un poco como funciona tu código, de mientras iré buscando mas documentación sobre threads.

Un saludo y gracias.

EDITO: Ese erro ya lo corregí, era obvio, pero yo sigo sin verlo...
« Última modificación: 29 Agosto 2013, 14:43 pm por Zoik » En línea

Fakedo0r

Desconectado Desconectado

Mensajes: 21


Fuera de compás, en una de las 12 dimensiones...


Ver Perfil WWW
Re: Mi SwingWorker no se cancela
« Respuesta #5 en: 29 Agosto 2013, 14:57 pm »

Hola, amigo, me estoy bajando el eclipse desde mi despacho para probar y ver como que no funciona el código. Primero, no entiendo muy bien eso de componente jComboBox que dices ya que obviamente desde fuera no tienes acceso a tus atributos de la clase ya que son privadas. Segundo, tienes el objeto Calendar en un bucle y innecesariamente obtienes la instancia de la clase en cada vuelta, algo inútil. Y lo de explicar el código, ya te lo explique porque puse la variable "running". Normalmente cuando creas el hilo y quieres tenerlo en constante ejecución necesitas el uso de bucles. Cuando quieres terminar el hilo rompes el bucle y listo.
En línea

Zoik

Desconectado Desconectado

Mensajes: 91


Ver Perfil
Re: Mi SwingWorker no se cancela
« Respuesta #6 en: 29 Agosto 2013, 15:10 pm »

Respecto a lo primero, porque no te e puesto todo el código  :silbar:.
Y lo segundo, bueno si te refieres a:

Código
  1. calendario = Calendar.getInstance();

Es debido a que a cada segundo quiero saber la hora, y la hora la extrae este comando, si lo pusiese fuera solo sabría la hora de el momento que le doy al botón, o eso entendi cuando lo estuve investigando.

si por otra parte te refieres a esto:

Código
  1. Calendar calendario;

Si, podría haberlo declarado arriba...

Agradezco el esfuerzo por un noob como yo  :)
En línea

Fakedo0r

Desconectado Desconectado

Mensajes: 21


Fuera de compás, en una de las 12 dimensiones...


Ver Perfil WWW
Re: Mi SwingWorker no se cancela
« Respuesta #7 en: 29 Agosto 2013, 15:36 pm »

Hola, ya veo tu error, mi fallo técnico por no haber fijado en la condición que le das al bucle. Obviamente no saldrá del bucle en estado actual. Te pondre en pseudo-código para que entiendas.

Es tu condición:

Código:
Hacer {
 
var1
var2
var3

 Las acciones

} (Mientras var1 sea diferente a X o mientras var2 sea diferente a x o mientras var3 sea diferente a X o mientras running sea true)

Es decir solo con que se cumpla una de las 4 condiciones seguirá dando vuelta sin tener en cuenta el valor de los otros, por lo tanto no saldrá del bucle. No se si me he explicado ?

Al final te quedaría:

Código
  1. package pkg_main;
  2.  
  3. import java.util.Calendar;
  4.  
  5. import javax.swing.SwingWorker;
  6.  
  7. public class CLS_CheckTime extends SwingWorker<Object, Object> {
  8. private int copyHour;
  9. private int copyMin;
  10. private int copySec;
  11. private boolean running;
  12.  
  13. public CLS_CheckTime(int hour, int min, int sec) {
  14. copyHour = hour;
  15. copyMin = min;
  16. copySec = sec;
  17. }
  18.  
  19. protected Object doInBackground() throws Exception {
  20. Calendar calendario;
  21.  
  22. int thisHour;
  23. int thisMin;
  24. int thisSec;
  25.  
  26. this.running = true;
  27.  
  28. System.out.println("iniciado!");
  29.  
  30. do {
  31. calendario = Calendar.getInstance();
  32. thisHour = calendario.get(Calendar.HOUR_OF_DAY);
  33. thisMin = calendario.get(Calendar.MINUTE);
  34. thisSec = calendario.get(Calendar.SECOND);
  35.  
  36. System.out.println("funcionando: " + thisHour + ":" + thisMin + ":" + thisSec);
  37.  
  38. if (copyHour == thisHour && copyMin == thisMin && copySec == thisSec) {
  39. this.running = false;
  40. }
  41.  
  42. try {
  43. Thread.sleep(1000);
  44. } catch (InterruptedException e) {
  45. System.out.println("Thread sleep de ChekcHour a fallado");
  46. }
  47. } while (this.running);
  48.  
  49. System.out.println("APAGATE!");
  50. return null;
  51. }
  52.  
  53. public void stopThread() {
  54. this.running = false;
  55. }
  56. }
  57.  

Espero que te haya servido. Saludos.
« Última modificación: 29 Agosto 2013, 15:55 pm por Fakedo0r » En línea

Zoik

Desconectado Desconectado

Mensajes: 91


Ver Perfil
Re: Mi SwingWorker no se cancela
« Respuesta #8 en: 29 Agosto 2013, 16:18 pm »

Es decir que según tu razonamiento, si yo introduzco por ejemplo las 12:56:00 y el Calendar me coge 11:55:00, se me saldra del bucle ya que con que solo uno de los 3 digitos sea igual a el introducido se marchara, eso no es lo que quiero, quiero que salga del bucle, en dos casos, o que yo le de a cancelar, para eso esta el running, o que la hora que yo introduzca sea igual a la que me coja el Calendar.

Un saludo.
En línea

Fakedo0r

Desconectado Desconectado

Mensajes: 21


Fuera de compás, en una de las 12 dimensiones...


Ver Perfil WWW
Re: Mi SwingWorker no se cancela
« Respuesta #9 en: 29 Agosto 2013, 16:24 pm »

El código que te he dejado, evalúa los 3 valores y también el estado de running.

Si quieres por ejemplo solo evaluar la hora y el minuto, entonces quita la tercera condición y listo.
No hay nada complicado, lo que yo veo es que necesitas leer programación básica porque estas cosas son básicas y esenciales que deberías de saber antes de intentar trabajar con otras cosas más avanzadas.
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines