Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [Java] Terminazione Thread

    Ciao qualcuno può aiutarmi a risolvere il mio problema? In sostanza non riesco a chiudere un thread.Questo thread incapsula la creazione di un JFrame che contiene un player java.
    Questa è una delle 600 prove che ho fatto...ma questo maledetto thread non si vuole chiudere!

    Questo è l'actionPerformed della classe

    codice:
    public void actionPerformed(ActionEvent ae) 
       {
         Object source=ae.getSource();
         
         // ****** Salvataggio Cartelle che conterranno file Jpg ******
         if (source==grabButton)
         { 
            JFileChooser finestra= new JFileChooser();
            finestra.setDialogTitle("Salva Files");
            finestra.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
            finestra.setCurrentDirectory( new File ("c:\\"));
            
           
           int risposta=finestra.showSaveDialog(this);
           if (risposta == JFileChooser.APPROVE_OPTION) 
            {
              File cart = finestra.getSelectedFile();
              urlFrames=cart.getAbsolutePath();
              if (T_grabvideo == null) 
              {
               T_grabvideo = new Threadgrabvideo();
               T_grabvideo.start();
              }
            }
          }
    
          if (source==closeButton) 
              T_grabvideo=null;
        } //chiusura ectionPerformed
    
    
    //CLASSE CHE INCAPSULA IL THREAD
    
    class Threadgrabvideo extends Thread
       {
         public void run()
                {
                 
                 int k=1;
                 int j=0;
                  try
                  {
                    
                    //while(true)
                    //{
                    //File cart = finestra.getSelectedFile();
                    //urlFrames=cart.getAbsolutePath();
                    int frameId=0;
                    for ( int i=0; i<=totalFrames; i=i+camp) 
                     {
                       j++;
                       frameId++;
                       // inizialmente mi posiziono sul frame 0 (istante 0)
                       if (i==0)
                        fpc.skip(0);
                       // poi mi posiziono sui frame successivi, secondo il campionamento
                       else
                        fpc.skip(camp);
             
                       // grabba il frame relativo
                       if (currentFrame !=FramePositioningControl.FRAME_UNKNOWN) 
                       {
                        currentFrame =fpc.mapTimeToFrame(p.getMediaTime());
                        currentTime = fpc.mapFrameToTime(i);
                       }
            
                       Buffer buff = new Buffer();
                       buff = fgc.grabFrame();
                       // converte buffer - image
                      BufferToImage bti = new BufferToImage((VideoFormat)buff.getFormat());
                      img = bti.createImage(buff);
                       
                         if(j%65==0) k++; //k è il nome della cartella
                         //elimino dal nome del video la parte finale...x poi utilizzarlo
                         //come nome delle cartelle riferite a quel video
                         namefile=namefile.replaceAll(".avi","");
                            //creazione cartella
                         new File(urlFrames+"/"+namefile+"_"+k).mkdirs();
                            //percorso dei file jpg
                         String pathFrame = (urlFrames+"/"+namefile+"_"+k+"/"+j+".jpg");
                         File fileFrame = new File(pathFrame);
                          //creazione del percorso del commento e del medesimo
                         pathCommentsTxt=(urlFrames+"/"+namefile+"_"+k+"/Comments_"+k+".txt");
                         FileOutputStream file = new FileOutputStream(pathCommentsTxt);
                         
                         //inserisco 64 spazi vuoti all'interno di ogni file .txt creato
                         //altrimenti si generano eccezioni
                         File f1=new File(pathCommentsTxt);
                         FileOutputStream fos1=new FileOutputStream(f1);
                         PrintStream ps1=new PrintStream(fos1);
                         for (int l=0;l<65;l++)
                            ps1.println("");        
                         
    
                      try 
                       {
                        System.err.println(currentTime.getSeconds());
                        ImageSaver(img,fileFrame);
                       }
                      catch (Exception e) 
                       {
                        System.err.println(e);
                       } 
                      }
                    System.err.println(frameId); 
                    //}
                  }
                  
                  catch (Exception EX) 
                  { 
                   //System.out.println("errore");
                    System.out.println(EX);
                  }
                  
                }
       }
    Sempre allinterno della stessa classe che contiene l'actionperformed,ho creato una classe che manda in esecuzione il thread (class Threadgrabvideo).
    In sostanza quando si preme il "closeButton" si dovrebbe fermare l'esecuzione del video nel player (infatti ho impostato T_grabvideo=null...ma ancora non ci sono riuscito :S
    A riguardo ho letto anche molte discussioni anche di questo sito che ho trovato tramite google...ma non ho risolto il problema.
    Vi prego...salvatemi

  2. #2
    Nessuno può darmi una mano?

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    813
    Originariamente inviato da divincodin
    Nessuno può darmi una mano?
    Premetto che i metodi per terminare un thread sono deprecati e non vanno mai usati. Dev'essere il programmatore a gestire la chiusura "pulita" del thread, mediate degli artifizi, se così li vogliamo chiamare.
    Mettere a null il riferimento al thread non ti porterà al tuo scopo.

    Dunque...
    ecco come andrebbe modificata la classe thread

    codice:
    class Threadgrabvideo extends Thread
       {
        private boolean shutdown = false;
        public synchronized void shutdown(){shutdown=true;}
        public synchronized boolean isShuttingDown(){return shutdown;}
         public void run()
                {
                 
                 int k=1;
                 int j=0;
                  try
                  {
                    
                    //while(true)
                    //{
                    //File cart = finestra.getSelectedFile();
                    //urlFrames=cart.getAbsolutePath();
                    int frameId=0;
                    int i=0;
                    while((i<=totalFrames) && !isShuttingDown())
                     {
                       j++;
                       frameId++;
                       // inizialmente mi posiziono sul frame 0 (istante 0)
                       if (i==0)
                        fpc.skip(0);
                       // poi mi posiziono sui frame successivi, secondo il campionamento
                       else
                        fpc.skip(camp);
             
                       // grabba il frame relativo
                       if (currentFrame !=FramePositioningControl.FRAME_UNKNOWN) 
                       {
                        currentFrame =fpc.mapTimeToFrame(p.getMediaTime());
                        currentTime = fpc.mapFrameToTime(i);
                       }
            
                       Buffer buff = new Buffer();
                       buff = fgc.grabFrame();
                       // converte buffer - image
                      BufferToImage bti = new BufferToImage((VideoFormat)buff.getFormat());
                      img = bti.createImage(buff);
                       
                         if(j%65==0) k++; //k è il nome della cartella
                         //elimino dal nome del video la parte finale...x poi utilizzarlo
                         //come nome delle cartelle riferite a quel video
                         namefile=namefile.replaceAll(".avi","");
                            //creazione cartella
                         new File(urlFrames+"/"+namefile+"_"+k).mkdirs();
                            //percorso dei file jpg
                         String pathFrame = (urlFrames+"/"+namefile+"_"+k+"/"+j+".jpg");
                         File fileFrame = new File(pathFrame);
                          //creazione del percorso del commento e del medesimo
                         pathCommentsTxt=(urlFrames+"/"+namefile+"_"+k+"/Comments_"+k+".txt");
                         FileOutputStream file = new FileOutputStream(pathCommentsTxt);
                         
                         //inserisco 64 spazi vuoti all'interno di ogni file .txt creato
                         //altrimenti si generano eccezioni
                         File f1=new File(pathCommentsTxt);
                         FileOutputStream fos1=new FileOutputStream(f1);
                         PrintStream ps1=new PrintStream(fos1);
                         for (int l=0;l<65;l++)
                            ps1.println("");        
                         
    
                      try 
                       {
                        System.err.println(currentTime.getSeconds());
                        ImageSaver(img,fileFrame);
                       }
                      catch (Exception e) 
                       {
                        System.err.println(e);
                       } 
                      }
                    i+=camp;
                    System.err.println(frameId); 
                    //}
                  }
                  
                  catch (Exception EX) 
                  { 
                   //System.out.println("errore");
                    System.out.println(EX);
                  }
                  
                }
       }
    ovviamente chiudi il threadn invocando il metodo shutdown e non semplicemente sovrascrivendo il riferimento a null

    bye
    Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!

  4. #4
    Si,lo so che sono deprecati...Cmq ho risolto,fermo il thread tramite una variabile booleana (controllo)...Ho risolto...dimenticavo a effettuare un controllo nell'intestazione del ciclo for:

    codice:
    for ( int i=0; i<=totalFrames && controllo; i=i+camp)
    In modo che non appena premo il bottone "interrompi" controllo lo imposto a false ed il ciclo for termina istantaneamente!
    Era + semplice di quanto sembrasse...ho perso alcuni giorni x aver dimenticato di inserire questo controllo

    Cmq ti ringrazio ugualmente per la tua disponibilità,visto che sei stato l'unico a rispondere...GRAZIE

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    813
    Originariamente inviato da divincodin
    Si,lo so che sono deprecati...Cmq ho risolto,fermo il thread tramite una variabile booleana (controllo)...Ho risolto...dimenticavo a effettuare un controllo nell'intestazione del ciclo for:

    codice:
    for ( int i=0; i<=totalFrames && controllo; i=i+camp)
    In modo che non appena premo il bottone "interrompi" controllo lo imposto a false ed il ciclo for termina istantaneamente!
    Era + semplice di quanto sembrasse...ho perso alcuni giorni x aver dimenticato di inserire questo controllo

    Cmq ti ringrazio ugualmente per la tua disponibilità,visto che sei stato l'unico a rispondere...GRAZIE
    in pratica...è quello che ti ho detto io...
    cmq ti consiglio di mettere un metodo synchronized per ottenere la variabile controllo, poiché essa può essere modifica, anzi, è modificata in modo concorrente e non sequenziale
    Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!

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.