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

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  proceso en segundo plano que me reemplaza paneles, en modo debugger funciona
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: proceso en segundo plano que me reemplaza paneles, en modo debugger funciona  (Leído 2,663 veces)
jadi

Desconectado Desconectado

Mensajes: 2


Ver Perfil
proceso en segundo plano que me reemplaza paneles, en modo debugger funciona
« en: 6 Febrero 2021, 04:33 am »

Hola como estan?.
Estoy tratando de desarrollar un juego, el cual tiene dialogos que se muestran en secuencia.
Dentro del jFrame tengo un panel llamado jPanelCuerpo el cual tiene un panel jPortada que muestra la imagen de presentacion.
los dialogos están en secuencia (estos se instancian en un panel de dialogo) y tienen un atributo estado el cual indica (instanciado=0, en ejcución=1 o finalizado=2), además tienen un indice que apunta al dialogo en proceso.
El proceso en segundo plano verifica el estado del dialogo en proceso si esta instanciado, reemplaza el panel de portada por el panel del dialogo y le pone estado en ejecucion, del mismo panel de dialogo tiene un jlabel con un con evento mouseclic que pone el dialogo es estado finalizado,
Cuando el proceso en segundo plano se entera de que cambio el estado a finalizado pasa al siguiente dialogo.

Si ejecuto el programa solo me muestra el primer dialogo, si ejecuto en modo debugger al ir verificando los pasos se cambian los dialogos sin problema.

Es como si al ir paso a paso el proceso tiene el tiempo para realizar los cambios, al correr normal pareciera que solo pone el primer dialogo

Si alguien me puede orientar que puede ser desde ya muy agradecido
Saludos
Javier

Clase runnable que instancio en un thread que guardo como atributo(hiloJ) del jFrame Juego
Código
  1. public class EjecutarSuceso implements Runnable {
  2.    private Jugar fParent;
  3.    private JPanel jPanelCuerpo;
  4.    private Dialogo jpanelJuegoD;               // panel para los dialogos  (multiples instancias)
  5.    private Reto jpanelJuegoR;                  // panel para los retos     (multiples instancias)
  6.    private SieteYMedio jpanelJuegoS;           // panel para el siete y medio
  7.    private EntradaPc jpanelJuegoH;             // panel para el hackeo
  8.    private int ultimoTSuceso;                  // indica el último suceso ejecutado
  9.  
  10.    public EjecutarSuceso(Jugar fp, JPanel jpanel) {
  11.        fParent=fp;
  12.        jPanelCuerpo=jpanel;
  13.    }
  14.  
  15.    @Override
  16.    public void run(){
  17.        int tipoSuceso;
  18.        boolean lupdateui=false;
  19.        boolean linstancio=false;
  20.  
  21.        ultimoTSuceso=0;
  22.        // tengo que recorrer el array de los sucesos del escenario, tomando
  23.        // en cuenta el estado del escenario si no termino y el estado del suceso
  24.        // si el estado del escenario indica que termino finalizo ya que puedo desde otra
  25.        // parte indicar que termine
  26.        // si el estado del suceso es que esta instanciado invoco al evento correspondiente
  27.        // actualizando el estado del suceso a estado en ejecución
  28.        // si el estado del suceso esta en ejecucion no hago nada, espero a que cambie
  29.        // su estado desde otra parte del juego
  30.        // si el estado del suceso es finalizado paso al siguiente y si no hay un siguiente
  31.        // pongo en el estado de escenario fin y salgo del while
  32.        while (true){
  33.  
  34.            // si el escenario se marco como terminado salgo del while
  35.            if (fParent.getEscenario().getEstado()==Sistema.EEND) {
  36.                break;
  37.            }
  38.            // si el suceso instanciado termino
  39.            if (fParent.getEscenario().getCurrentSuceso().getEstado()==Sistema.EEND) {
  40.                // si no hay un siguiente suceso pongo en el escenario el atributo estdo como terminado y salgo del while
  41.                if (!(fParent.getEscenario().setNextIndice())){
  42.                    fParent.getEscenario().setEstado(Sistema.EEND);
  43.                    break;
  44.                }
  45.            }
  46.  
  47.            // si el suceso esta en estado creado
  48.            if (fParent.getEscenario().getCurrentSuceso().getEstado()==Sistema.ECREADO) {
  49.  
  50.                // pongo a false linstacio
  51.                linstancio=false;
  52.                // vemos segun el tipo de suceso si ya instanciado el objeto o sino lo instancio
  53.                // almaceno el tipo del suceso en curso
  54.                tipoSuceso=fParent.getEscenario().getCurrentSuceso().getTipoSuceso();
  55.                switch (tipoSuceso){
  56.                    // Dialogos
  57.                    case Sistema.DIALOGO:
  58.                        // si no esta instanciado el objeto panel dialogo lo instancio
  59.                        // sino actualizo los componentes
  60.                        if (jpanelJuegoD==null){
  61.                            jpanelJuegoD = new Dialogo(fParent);
  62.                            linstancio=true;
  63.                        }
  64.                        break;
  65.                    // Retos
  66.                    case Sistema.DESAFIO:
  67.                        if (jpanelJuegoR==null){
  68.                            jpanelJuegoR = new Reto((Jugar)fParent);
  69.                            linstancio=true;
  70.                        }
  71.                        break;
  72.                    // Siete y Medio
  73.                    case Sistema.OBJETIVO_SIETEYMEDIO:
  74.                        // si es objetivo hay que ver si es siete y medio o hackeo
  75.                        if (jpanelJuegoS==null){
  76.                            jpanelJuegoS = new SieteYMedio((Jugar) fParent);
  77.                            linstancio=true;
  78.                        }
  79.                        break;
  80.                    // por defecto si no es uno de los sucesos anteriores es el hackeo
  81.                    default:
  82.                        if (jpanelJuegoS==null){
  83.                            jpanelJuegoH = new EntradaPc((Jugar) fParent, jPanelCuerpo);
  84.                            linstancio=true;
  85.                        }
  86.                        break;
  87.                }
  88.  
  89.                // si el suceso a ejecutarse es distinto al que su anterior verifico
  90.                // que quede un solo componente en jPanelCuerpo
  91.                if ((tipoSuceso!=ultimoTSuceso) && (jPanelCuerpo.getComponentCount()>1)){
  92.                    jPanelCuerpo.remove(0);
  93.                    lupdateui=true;
  94.                }
  95.  
  96.                // tengo que poner el setvisible del panel portada en false si esta visible
  97.                if (jPanelCuerpo.getComponent(jPanelCuerpo.getComponentCount()-1).isVisible()){
  98.                    jPanelCuerpo.getComponent(jPanelCuerpo.getComponentCount()-1).setVisible(false);
  99.                }
  100.  
  101.                // si es un DIALOGO, hay multiples DIALOGOS
  102.                if (Sistema.DIALOGO==tipoSuceso){
  103.                    if (tipoSuceso!=ultimoTSuceso) {
  104.                        // fParent.cambiarPanel(jpanelJuegoD);
  105.                        jPanelCuerpo.add(jpanelJuegoD, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, 870, 525),0);
  106.                        // hago visible el jpanelJuego
  107.                        jPanelCuerpo.getComponent(0).setVisible(true);
  108.                        if (!linstancio){
  109.                            jpanelJuegoD.updatePanel();
  110.                        }
  111.                    }
  112.                    // si el suceso es del mismo tipo quel anteriior solo actualizo para el suceso los componentes
  113.                    else {
  114.                        jpanelJuegoD.updatePanel();
  115.                    }
  116.                }
  117.                // si es un DESAFIO, hay multiples DESAFIOS
  118.                else if(Sistema.DESAFIO==tipoSuceso){
  119.                    if (tipoSuceso!=ultimoTSuceso) {
  120.                        jPanelCuerpo.add(jpanelJuegoR, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, 870, 525),0);
  121.                        // hago visible el jpanelJuego
  122.                        jpanelJuegoR.setVisible(true);
  123.                        if (!linstancio){
  124.                            jpanelJuegoR.updatePanel();
  125.                        }
  126.                    }
  127.                    // si el suceso es del mismo tipo quel anteriior solo actualizo para el suceso los componentes
  128.                    else {
  129.                            jpanelJuegoR.updatePanel();
  130.                    }
  131.                }
  132.                // si es el objetivo SIETE Y MEDIO solo hay UNA INSTANCIA
  133.                else if(Sistema.OBJETIVO_SIETEYMEDIO==tipoSuceso){
  134.                    jPanelCuerpo.add(jpanelJuegoS, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, 870, 525),0);
  135.                    // hago visible el jpanelJuego
  136.                    jpanelJuegoS.setVisible(true);
  137.                }
  138.                // sino solo puede ser el HACKEO, solo hay UNA INSTANCIA
  139.                else{
  140.                    jPanelCuerpo.add(jpanelJuegoH, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, 870, 525),0);
  141.                    // hago visible el jpanelJuego
  142.                    jpanelJuegoH.setVisible(true);
  143.                }
  144.  
  145.                // indico que se esta ejecutando
  146.                    fParent.getEscenario().getCurrentSuceso().setEstado(Sistema.ERUN);
  147.                // cargo la fecha de inicio
  148.                fParent.getEscenario().getCurrentSuceso().setFechaIni(new Date());
  149.                ultimoTSuceso=tipoSuceso;
  150.                jPanelCuerpo.invalidate();
  151.                jPanelCuerpo.updateUI();
  152.                try {
  153.                    // pongo a dormir el hilo del procesos
  154.                    fParent.getHiloJ().sleep(20);
  155.                } catch (InterruptedException ex) {
  156.                    Logger.getLogger(EjecutarSuceso.class.getName()).log(Level.SEVERE, null, ex);
  157.                }
  158.            }
  159.        }
  160.    }
  161. }
  162.  






« Última modificación: 12 Febrero 2021, 17:01 pm por simorg » En línea

rub'n


Desconectado Desconectado

Mensajes: 1.217


(e -> λ("live now")); tatuar -> λ("α");


Ver Perfil WWW
Re: proceso en segundo plano que me reemplaza paneles, en modo debugger funciona
« Respuesta #1 en: 11 Febrero 2021, 23:14 pm »

Que tal doc, usa Geshi con Java, para que añadas una descripcion basica mas detallada, en las lineas mas potenciales si es posible.

Estas variables podria aplicar locks con synchronized() {} (siempre como ultima instancia, para evitar deadlocks), hacerlas inmutables o con Referencias atomicas, dado que estan en un background thread

- fParent
- jPanelCuerpo

Mismo para estas variables booleanas dentro del Thread Referencia Atomica

Código
  1. AtomicBoolean atomicBoolean = new AtomicBoolean();
- lupdateui
- linstancio

Aun asi, necesitaria mas codigo, sobre todo de las variables de instancia.



Otra cosa que no entiendo es la siguiente, si necesitas que los paneles se muestren de manera secuencial, es decir no paralela, porque implementas a Runnable?

Has intentado hacer todo sin sobreescribir el método run() ? el run es asíncrono, paralelo no secuencial, si quieres añade la clausula synchronized al método ya creado y comprueba su comportamiento


Código
  1. @Override
  2. public synchronized void run(){ }


« Última modificación: 12 Febrero 2021, 19:47 pm por rub'n » En línea



rubn0x52.com KNOWLEDGE  SHOULD BE FREE.
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen ki
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ficheros .bat en Segundo Plano?¿ « 1 2 »
Hacking
yisas_fight 14 37,820 Último mensaje 8 Septiembre 2011, 09:36 am
por WHK
ejecutar un bat en segundo plano « 1 2 »
Scripting
Cronos - Carthago 11 20,395 Último mensaje 18 Julio 2013, 01:31 am
por Eleкtro
segundo plano
Windows
makinavaja3500 2 2,815 Último mensaje 6 Diciembre 2012, 21:32 pm
por makinavaja3500
Ejecutar un proceso en segundo plano en python
Scripting
Sentex 7 5,689 Último mensaje 1 Abril 2018, 18:59 pm
por engel lex
Ayuda, debuggear proceso en segundo plano
Ingeniería Inversa
Jholer 1 2,399 Último mensaje 28 Abril 2019, 21:13 pm
por Geovane
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines