Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - Gestione Thread durante ricerca dispositivi bluetooth
Forum - Java - Gestione Thread durante ricerca dispositivi bluetooth

Avatar
Moon Knight (Ex-Member)
Rookie


Messaggi: 47
Iscritto: 07/12/2009

Segnala al moderatore
Postato alle 18:16
Venerdì, 16/07/2010
Ciao, nel prossimo programma che a breve pubblicherò qui nel forum, avrei bisogno di un aiutino. Vi spiego velocemente: ho creato un semplice programma che permette di trovare dispositivi bluetooth. Siccome la ricerca impiega molti secondi, volevo avviare una JProgresBar che, finito tutto, tornava inattiva. Ho visto che si richiede la gestione dei Thread: ma dove lo devo mettere l'oggetto di tipo Thread??? Nella parte del programma principale oppure nella classe che ascolta gli eventi della pressione del pulsante di ricerca? O in altri posti? Vi ringrazio moltissimo per l'aiuto! :)
Allego qui i file:
Per il bluetooth, scaricate "bluecove" da qui: http://code.google.com/p/bluecove/downloads/list
e poi il progetto (in Eclipse) in allegato.
Grazie ancora! :k:

Ultima modifica effettuata da Moon Knight il 16/07/2010 alle 18:19
PM Quote
Avatar
paoloricciuti (Ex-Member)
Pro


Messaggi: 137
Iscritto: 27/04/2010

Segnala al moderatore
Postato alle 20:11
Venerdì, 16/07/2010
Beh puoi scegliere tu, potresti fare un Classe che implementi Runnable al quale bisogna passare un'oggetto di tipo JProgressBar e uno di tipo "La classe che hai usato tu per ricercare i dispositivi" e quindi fai fare tutto nel Thread. Oppure potresti creare la classe Runnable come inner class dell'interfaccia Grafica e quindi avresti bisogno di un metodo nella classe che ricerca i dispositivi che ti dica a che livello percentuale si trova la scansione. Potresti farla come innerclass della classe che ricerca i dispositivi e farti passare la progress bar sul quale lavorare nel costruttore di questa classe. Hai infinite possibilità!!

PM Quote
Avatar
Moon Knight (Ex-Member)
Rookie


Messaggi: 47
Iscritto: 07/12/2009

Segnala al moderatore
Postato alle 20:29
Venerdì, 16/07/2010
Ti ringrazio per le infinite opportunità ma proprio non riesco: avevo tentato di fare altre classi ma avevo il problema dell'aggiornamento del JProgressiveBar
Se vuoi dare un'occhiata al codice lo trovi  qui:
http://forum.html.it/forum/showthread.php?s=&threadid=1414167
Ho postato tutto il codice, vedendolo meglio capisci i miei problemi.
Grazie ancora per la risposta :)

PM Quote
Avatar
paoloricciuti (Ex-Member)
Pro


Messaggi: 137
Iscritto: 27/04/2010

Segnala al moderatore
Postato alle 20:52
Venerdì, 16/07/2010
Ma tu in base a cosa la vuoi far scorrere questa progress bar? O meglio: sai dopo quanto tempo si ferma la ricerca dei dispositivi??

PM Quote
Avatar
Moon Knight (Ex-Member)
Rookie


Messaggi: 47
Iscritto: 07/12/2009

Segnala al moderatore
Postato alle 10:31
Sabato, 17/07/2010
Ciao, scusa se mi sono spiegato male: quando l'utente clicca sul pulsante "ricerca dispositivi" viene attivata una animazione da parte della JProgressBar (l'istruzione che avviene è <barraProgressiva.setIndeterminate(true)>;). Tutta questa animazione dura tutta la ricerca dei dispositivi (cioè fino alla fine del metodo relativo al click del mouse).
L'istruzione"setIndeterminate(true)" viene utilizzata quando non si sa il tempo che ci impiega il computer per eleborare i dati.
Quindi l'utente clicca sul pulsante, poi viene fatta la ricerca dei dispositivi in contemporanea con l'animazione della barra progressiva, una volta concluso la ricerca, l'animazione si ferma.
Secondo te come dovrei operare? :)

PM Quote
Avatar
paoloricciuti (Ex-Member)
Pro


Messaggi: 137
Iscritto: 27/04/2010

Segnala al moderatore
Postato alle 13:39
Sabato, 17/07/2010
Allora molto semplicemente fatti passare la progress bar nel costruttore della classe RemoteDeviceDiscovery. In questa classe nel metodo inquiryCompleted inserisci jProgressBar.setIndeterminate(false);

PM Quote
Avatar
Moon Knight (Ex-Member)
Rookie


Messaggi: 47
Iscritto: 07/12/2009

Segnala al moderatore
Postato alle 14:02
Sabato, 17/07/2010
Ti ringrazio, ma purtroppo provando (seguendo i tuoi consigli) non funziona:
# la class RemoteDevices non ha costruttore (sono tutti static)
# ho tentato di far passare la barra tra le classi ma l'animazione non parte.

Ecco il testo per farti capire come ho operato

Codice sorgente - presumibilmente Java

  1. [CODE]
  2. package mercurio;
  3.  
  4. import java.awt.*;
  5. import javax.swing.*;
  6.  
  7. public class Mercurio extends JFrame implements Runnable
  8. {
  9.         private static final long serialVersionUID = 1L;
  10.         private final String TITOLO_APPLICAZIONE =      "Mercurio";
  11.         private final String nomeIconaFrame =           "icone//iconaProgrammaPrincipale.gif";
  12.         private JPanel jContentPane;
  13.         private Pulsante avviaRicerca;
  14.         private Pulsante chiudiProgramma;
  15.         private BarraScorrimento barre;
  16.         private JTextArea areaTesto;
  17.         private JProgressBar barraProgressiva;
  18.         private CercaDispositivi classCercaDispositivi;
  19.         private ChiudiProgramma classChiudiProgramma;
  20.        
  21.         /**
  22.          * Costruisce il pulsante "Avvia ricerca"
  23.          */
  24.         private Pulsante creaAvviaRicerca()
  25.         {
  26.                 final String AVVIA_RICERCA =    "Ricerca dispositivi";
  27.                 final String nomeFile =                 "icone//avviaRicerca.gif";
  28.                 return  (new Pulsante(AVVIA_RICERCA, nomeFile));
  29.         }
  30.        
  31.         /**
  32.          * Costruisce il pulsante "Chiudi Programma"
  33.          */
  34.         private Pulsante creaChiudiProgramma()
  35.         {
  36.                 final String CHIUDI_PROGRAMMA =                 "Chiudi programma";
  37.                 final String nomeFile =                                 "icone//chiudiProgramma.gif";
  38.                 return  (new Pulsante(CHIUDI_PROGRAMMA, nomeFile));
  39.         }
  40.        
  41.         /**
  42.          * Costruisce l'area di testo
  43.          */
  44.         private JTextArea creaAreaTesto()
  45.         {
  46.                 areaTesto = new JTextArea(20, 40);
  47.                 areaTesto.setEditable(false);
  48.                 return areaTesto;
  49.         }
  50.        
  51.         /**
  52.          * Costruisce le barre di scorrimento
  53.          */
  54.         private BarraScorrimento creaBarraScorrimento(JTextArea area)
  55.         {
  56.                 barre = new BarraScorrimento(area, true, true);
  57.                 return barre;
  58.         }
  59.        
  60.         /**
  61.          * Costruisce la barra di avanzamento
  62.          */
  63.         private JProgressBar creaBarraProgressiva()
  64.         {
  65.                 final int min = 0;
  66.                 final int max = 0;
  67.                 barraProgressiva = new JProgressBar(min, max);
  68.                 return barraProgressiva;
  69.         }
  70.        
  71.         /**
  72.          * Delegazione degli eventi ai pulsanti
  73.          */
  74.         private void delegazioneEventi()
  75.         {
  76.                 classCercaDispositivi = new CercaDispositivi(barraProgressiva);
  77.                 classChiudiProgramma = new ChiudiProgramma();
  78.                 avviaRicerca.addMouseListener(classCercaDispositivi);
  79.                 chiudiProgramma.addMouseListener(classChiudiProgramma);
  80.         }
  81.        
  82.         /**
  83.          * @param args Variabili di entrata (non necessarie)
  84.          */
  85.         public static void main(String[] args)
  86.         {
  87.                 SwingUtilities.invokeLater(new Runnable()
  88.                 {
  89.                         public void run()
  90.                         {
  91.                                 Mercurio thisClass = new Mercurio();
  92.                                 thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  93.                                 thisClass.setVisible(true);
  94.                         }
  95.                 });
  96.         }
  97.  
  98.         /**
  99.          * This is the default constructor
  100.          */
  101.         public Mercurio()
  102.         {
  103.                 super();
  104.                 initialize();
  105.         }
  106.  
  107.         /**
  108.          * This method initializes this
  109.          *
  110.          * @return void
  111.          */
  112.         private void initialize()
  113.         {
  114.                 this.setName(TITOLO_APPLICAZIONE);
  115.                 this.setTitle(TITOLO_APPLICAZIONE);
  116.                 this.setSize(500, 500);
  117.                 Image icona = Toolkit.getDefaultToolkit().getImage(nomeIconaFrame);
  118.                 this.setIconImage(icona);
  119.                 this.setLocationRelativeTo(null);
  120.                 this.setResizable(false);
  121.                 this.setContentPane(getJContentPane());
  122.                 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  123.                 delegazioneEventi();
  124.         }
  125.  
  126.         /**
  127.          * This method initializes jContentPane
  128.          *
  129.          * @return javax.swing.JPanel
  130.          */
  131.         private JPanel getJContentPane()
  132.         {
  133.                 if (jContentPane == null)
  134.                 {
  135.                         jContentPane = new JPanel();
  136.                         jContentPane.setLayout(new  FlowLayout());
  137.                         avviaRicerca = creaAvviaRicerca();
  138.                         chiudiProgramma = creaChiudiProgramma();
  139.                         areaTesto = creaAreaTesto();
  140.                         barre = creaBarraScorrimento(areaTesto);
  141.                         barraProgressiva = creaBarraProgressiva();
  142.                         jContentPane.add(avviaRicerca);
  143.                         jContentPane.add(chiudiProgramma);
  144.                         jContentPane.add(barre);               
  145.                         jContentPane.add(barraProgressiva);
  146.                 }
  147.                 return jContentPane;
  148.         }
  149.  
  150.         @Override
  151.         public void run()
  152.         {
  153.                 if(classCercaDispositivi.isAvviato() == true)
  154.                 barraProgressiva.setIndeterminate(true);
  155.                 else
  156.                         barraProgressiva.setIndeterminate(false);
  157.         }
  158.  
  159. }
  160. [/CODE]



Codice sorgente - presumibilmente Java

  1. [CODE]
  2. package mercurio;
  3.  
  4. import java.io.*;
  5. import java.util.*;
  6. import javax.bluetooth.*;
  7. import javax.swing.*;
  8.  
  9. /**
  10.  * Minimal Device Discovery example.
  11.  */
  12. public class RemoteDeviceDiscovery
  13. {
  14.         private static final long serialVersionUID =                    1L;
  15.     private static final Vector<RemoteDevice> devicesDiscovered = new Vector<RemoteDevice>();
  16.  
  17.     public static Vector<RemoteDevice> search(final JProgressBar barra) throws IOException, InterruptedException
  18.     {
  19.         System.gc();
  20.         final Object inquiryCompletedEvent = new Object();
  21.         devicesDiscovered.clear();
  22.        
  23.         barra.setIndeterminate(true);
  24.        
  25.         DiscoveryListener listener = new DiscoveryListener()
  26.         {
  27.  
  28.             public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod)
  29.             {
  30.                 System.out.println("Dispositivo " + btDevice.getBluetoothAddress() + " trovato");
  31.                 devicesDiscovered.addElement(btDevice);
  32.                 try
  33.                 {
  34.                     System.out.println("\tNome " + btDevice.getFriendlyName(false));
  35.                 } catch (IOException cantGetDeviceName)
  36.                         {
  37.                                 System.out.println("Impossibile reperire il nome friendly del dispositivo");
  38.                         }
  39.             }
  40.  
  41.             public void inquiryCompleted(int discType)
  42.             {
  43.                 System.out.println("Interrogazione completata!");
  44.                 synchronized(inquiryCompletedEvent)
  45.                 {
  46.                     inquiryCompletedEvent.notifyAll();
  47.                 }
  48.                 barra.setIndeterminate(false);
  49.             }
  50.  
  51.             public void serviceSearchCompleted(int transID, int respCode)
  52.             {
  53.                 //Da implementare, eventualmente
  54.             }
  55.  
  56.             public void servicesDiscovered(int transID, ServiceRecord[] servRecord)
  57.             {
  58.                 //Da implementare, eventualmente
  59.             }
  60.         };
  61.  
  62.         synchronized(inquiryCompletedEvent)
  63.         {
  64.             boolean started = LocalDevice.getLocalDevice().getDiscoveryAgent().startInquiry(DiscoveryAgent.GIAC, listener);
  65.             if (started)
  66.             {
  67.                 System.out.println("Attendere, ricerca in corso...");
  68.                 inquiryCompletedEvent.wait();
  69.                 System.out.println(devicesDiscovered.size() +  " dispositivi trovati");
  70.             }
  71.         }
  72.         return devicesDiscovered;
  73.     }
  74.  
  75. }
  76. [/CODE]



Codice sorgente - presumibilmente Java

  1. [CODE]
  2. package mercurio;
  3.  
  4. import java.io.*;
  5. import java.awt.event.*;
  6. import java.util.*;
  7.  
  8. import javax.bluetooth.RemoteDevice;
  9. import javax.swing.ImageIcon;
  10. import javax.swing.JOptionPane;
  11. import javax.swing.JProgressBar;
  12.  
  13. public class CercaDispositivi extends MouseAdapter
  14. {
  15.         private final String TITOLO =                   "Mercurio";
  16.         private final String nomeIconaFrame =   "icone//iconaProgrammaPrincipale.gif";
  17.         private Vector<RemoteDevice> devicesDiscovered;
  18.         private boolean avviato = false;
  19.         private JProgressBar barraAvanzamento;
  20.        
  21.         public CercaDispositivi(JProgressBar barra)
  22.         {
  23.                 barraAvanzamento = barra;
  24.         }
  25.        
  26.         public boolean isAvviato()
  27.         {
  28.                 return avviato;
  29.         }
  30.        
  31.         public void mouseClicked(MouseEvent ogg)
  32.         {
  33.                 avviato = true;
  34.                 final String ERRORE_INTERRUPT =                         "La ricarca è stata interrotta";
  35.                 final String ERRORE_IO =                                        "Non si riesce più a ricevere dati";
  36.                 final String ERRORE_GENERICO =                          "Errore irreversibile";
  37.                 final String NESSUN_DISPOSITIVO =                       "Nessun dispositivo presente";
  38.                 ImageIcon icona = new ImageIcon(nomeIconaFrame);
  39.                 try
  40.                 {
  41.                         devicesDiscovered = RemoteDeviceDiscovery.search(barraAvanzamento);
  42.                 }
  43.                         catch (InterruptedException e)
  44.                         {
  45.                                 JOptionPane.showMessageDialog(null, ERRORE_INTERRUPT, TITOLO, JOptionPane.ERROR_MESSAGE, icona);
  46.                                 e.printStackTrace();
  47.                         }
  48.                         catch (IOException e)
  49.                         {
  50.                                 JOptionPane.showMessageDialog(null, ERRORE_IO, TITOLO, JOptionPane.ERROR_MESSAGE);
  51.                                 e.printStackTrace();
  52.                         }
  53.                         catch (Throwable e)
  54.                         {
  55.                                 JOptionPane.showMessageDialog(null, ERRORE_GENERICO, TITOLO, JOptionPane.ERROR_MESSAGE);
  56.                                 e.printStackTrace();
  57.                         }
  58.                 if(devicesDiscovered == null)
  59.                 {
  60.                         JOptionPane.showMessageDialog(null, NESSUN_DISPOSITIVO, TITOLO, JOptionPane.INFORMATION_MESSAGE);
  61.                 }
  62.                 avviato = false;
  63.         }
  64.  
  65. }
  66. [/CODE]



Codice sorgente - presumibilmente Java

  1. [CODE]
  2. package mercurio;
  3.  
  4. import java.awt.event.*;
  5.  
  6. public class ChiudiProgramma extends MouseAdapter
  7. {      
  8.         public void mouseClicked(MouseEvent ogg)
  9.         {
  10.                 System.exit(0);
  11.         }
  12.        
  13. }
  14. [/CODE]



Codice sorgente - presumibilmente Java

  1. [CODE]
  2.  
  3. package mercurio;
  4.  
  5. import javax.swing.*;
  6.  
  7. public class Pulsante extends JButton
  8. {      
  9.         private static final long serialVersionUID =                    1L;
  10.        
  11.         public Pulsante(String testo, String urlIcona)
  12.         {
  13.                 ImageIcon icona = new ImageIcon(urlIcona);
  14.                 this.setText(testo);
  15.                 this.setIcon(icona);
  16.         }
  17.        
  18. }
  19. [/CODE]



Codice sorgente - presumibilmente Java

  1. [CODE]
  2.  
  3. package mercurio;
  4.  
  5. import javax.swing.*;
  6.  
  7. public class BarraScorrimento extends JScrollPane
  8. {      
  9.         private static final long serialVersionUID =                    1L;
  10.        
  11.         public BarraScorrimento(JTextArea areaTesto)
  12.         {
  13.                 this.setViewportView(areaTesto);
  14.                 this.setHorizontalScrollBarPolicy(HORIZONTAL_SCROLLBAR_AS_NEEDED);
  15.                 this.setVerticalScrollBarPolicy(VERTICAL_SCROLLBAR_AS_NEEDED);
  16.         }
  17.        
  18.         public BarraScorrimento(JTextArea areaTesto, boolean scrollHorrizonatl, boolean scrollVertical)
  19.         {
  20.                 this.setViewportView(areaTesto);
  21.                 if(scrollHorrizonatl == true)
  22.                         {
  23.                                 this.setHorizontalScrollBarPolicy(HORIZONTAL_SCROLLBAR_ALWAYS);
  24.                         }
  25.                 if(scrollVertical == true)
  26.                 {
  27.                         this.setVerticalScrollBarPolicy(VERTICAL_SCROLLBAR_ALWAYS);
  28.                 }
  29.         }
  30.        
  31. }
  32. [/CODE]



Scusami se sono pesanti, ma preferisco farti capire fino in fondo tutto l'argomento! :)

PM Quote
Avatar
Moon Knight (Ex-Member)
Rookie


Messaggi: 47
Iscritto: 07/12/2009

Segnala al moderatore
Postato alle 13:47
Domenica, 18/07/2010
Ah, ti volevo aggiornare: ho tentavo a fare come mi hai detto, ma non riesco proprio a far partire l'animazione. Maledetti thread! :grr:

PM Quote