Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    313

    [JAVA]Controllare lo stato di un thread

    Salve a tutti.Ho creato due thread :

    codice:
    Thread t =  new Thread(pb = new ProgresBar(GraphicInterfaceAgSpit.getInstance(this)));  
    t.start();         
    Thread t1 = new Thread( agT = new AgSetTIMIT(iform,sfXML.getNameFile(),pb.getProgresBar()));
    t1.start();
    Adesso vorrei sapere quando lo stato t1 termina,dato che la sua funzione è la scrittura su file.
    Come devo fare??

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA]Controllare lo stato di un thread

    Originariamente inviato da tcc
    Adesso vorrei sapere quando lo stato t1 termina,dato che la sua funzione è la scrittura su file.
    Come devo fare??
    In modo "sincrono" con t1.join()
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    313
    Ho fatto con join() in questo modo:
    codice:
    Thread t =  new Thread(pb = new ProgresBar(GraphicInterfaceAgSpit.getInstance(this)));  
                    Thread t1 = new Thread(agT = new AgSetTIMIT(iform,sfXML.getNameFile(),pb.getProgresBar()));
                    t.start();         
                    t1.start();
                    
                    try { 
                       t1.join();
                       pb.stopBar();
                       this.showWindow(iwindow = new WindowMsg((JFrame)GraphicInterfaceAgSpit.getInstance(this),this,"","Done"));
                    } catch (InterruptedException ex) {
                       
                    }
    Il problema ora è che viene creata la finestra della progresBar ma non si vede l'avanzamento.
    Qual'è il problema?

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    313
    Questa è la mia classe ProgresBar:

    codice:
    package agspit;
    
    import java.awt.*;
    import javax.swing.*;
    
    /**
     *
     * @author gennaro
     */
    public class ProgresBar extends JDialog implements IWindow,Runnable{
         
          private JProgressBar progresBar;
         
          
          
           
       public ProgresBar(JFrame frame){
           super(frame,"Progres bar",true);
           
          }
    
        
       
       public JProgressBar getProgresBar(){
           return this.progresBar;
       }
       
      
        
      
    
        public void setValueMin(int value){
            this.progresBar.setMinimum(value);
        }
        public void setValueMax(int value){
            this.progresBar.setMaximum(value);
        }
        
        public void stopBar(){
            this.progresBar.setIndeterminate(false);
        }
       
        public void run() {
           this.setResizable(false);       
           this.setBounds(450, 300, 400, 100);
           this.progresBar = new JProgressBar(JProgressBar.HORIZONTAL, 0, 300);
           JPanel panelProgresBar = new JPanel();
           SwingUtilities.invokeLater(new MyRunnable(this.progresBar));
           panelProgresBar.add(this.progresBar);
           this.getContentPane().setLayout(new BorderLayout());
           this.getContentPane().add(BorderLayout.NORTH,new JLabel("             Wait please......"));
           this.getContentPane().add(BorderLayout.CENTER,panelProgresBar);
           this.showWindow();
        }
    
        public void showWindow() {
            this.setVisible(true);
        }
    
        public void closeWindow() {
            this.dispose();
        }
    Adesso il thread per eseguire ProgressBar non porta aggiornamento della barra ovvero thread per l'esecuzione di AgSetTIMIT() funziona mentre per la classe ProgresBar viene visualizzata solo la finestra contenente la JProgressBar ma nn la JprogressBar.
    Dove sbaglio?

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quel metodo run() è eseguito da quale thread??? Se come immagino, è eseguito nel contesto di un tuo nuovo thread a parte, allora non va bene. Si dovrebbe interagire con l'interfaccia utente solo nel contesto del EDT.

    Leggi questa discussione in cui parlavo ieri delle questioni sui thread con Swing.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    313
    Ho visto un pò la doc di Sun sui threads è dice ad un certo punto questo fecendo anche un esempio :

    You can call invokeLater() from any thread to request the event-dispatching thread to run certain code. You must put this code in the run() method of a Runnable object and specify the Runnable object as the argument to

    invokeLater(). The invokeLater method returns immediately, without waiting for the event-dispatching thread to execute the code. Here's an example of using invokeLater():


    Runnable doWorkRunnable = new Runnable() {
    public void run() { doWork(); }
    };
    SwingUtilities.invokeLater(doWorkRunnable);

    Quindi ho fatto in questo modo :
    codice:
     Thread t =  new Thread( pb = new ProgresBar(GraphicInterfaceAgSpit.getInstance(this))); 
                    Thread t1 = new Thread(agT = new AgSetTIMIT(iform,sfXML.getNameFile()));        
                    SwingUtilities.invokeLater(new MyRunnable(pb.getProgresBar()));
                    t.start(); 
                    t1.start();
                     System.out.println("t prima del join :"+t.getState()); 
                       System.out.println("t1 prima del join: "+t1.getState());
                    try { 
                      
                       t.join(); 
                       t1.join();
                      
                       
                       System.out.println("t dopo del join :"+t.getState()); 
                       System.out.println("t1 dopo del join: "+t1.getState());
                    } catch (InterruptedException ex) {
                       
                    }
    
    dove MyRunnable():
    
    public class MyRunnable implements Runnable {
        
        private  JProgressBar pb;
        public MyRunnable(JProgressBar pb){
            this.pb=pb;
        }
    
        
        public void run() {   
         this.pb.setIndeterminate(true);
        
       } 
        
    }
    Ancora non mi è tanto chiaro.Qual'è il problema?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.