Newsgroup: it.comp.java
Titolo: Devo per forza creare un altro thread?

La mia applicazione si sta collegando ad un server e, dopo aver mandato un
messaggio di login sta attendendo la conferma. Durante questa attesa io
vorrei avvisare l'utente che non č tutto bloccato ma che č in attesa di una
risposta, per cui ho pensato di creare una semplice Dialog in cui c'č il
messaggio e un bottone per eventualmente interrompere l'attesa.
Il
problema č che la Dialog viene disegnata ma non il suo contenuto. Facendo
un pň di ricerche ho scoperto che dovrei creare un altro thread per
separare l'operazione di attesa dalla gestione della GUI, perň qui ho
qualche problema a livello teorico: il nuovo thread lo faccio per mostrare
la Dialog oppure per il ciclo di attesa? E' corretto se lo facessi con una
classe interna?
Avete qualche dritta da darmi?
Di seguito posto anche il
codice in oggetto, in modo che sia piů facile capire il tutto. Il flag
bAttendoRispostaLogin viene modificato da un thread che si occupa di
ricevere e smistare i messaggi dal server.
Grazie
Lis
bAttendoRispostaLogin = true;
JDialog dlgAttesa = new JDialog(this,
false);
JPanel pnlAttesa = new JPanel(new GridLayout(2, 1));
pnlAttesa.add(new JLabel("Attendo la risposta dal server....."));
JButton
btnAnnullaLogin = new JButton("Annulla");
btnAnnullaLogin.addActionListener(new ActionListener() {
	public void
actionPerformed(ActionEvent e) {
		bAnnullaLogin = false;
    }
});
pnlAttesa.add(btnAnnullaLogin);
dlgAttesa.getContentPane().add(pnlAttesa);
dlgAttesa.pack();
dlgAttesa.setResizable(false);
dlgAttesa.setLocationRelativeTo(null);
do {
	setCursor(new Cursor(Cursor.WAIT_CURSOR));
	repaint();
System.out.println("Attendo risposta login....");
	try {
Thread.sleep(1000);
	} catch (InterruptedException p) {}
} while
((bAttendoRispostaLogin) & (bAnnullaLogin == false));
dlgAttesa.dispose();
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
--------------------------------
Inviato via 
http://usenet.iol.it

Ho notato che, più in generale, quel ciclo di attesa mi crea qualche
problema: infatti, se per esempio mi arriva un messaggio che però non è
corretto, la routine di gestione dei messaggi in arrivo dovrbbe mostrare un
JOptionPane con un messaggio informativo, ma anche quest'ultimo non viene
disegnato correttamente.
Ciò mi fa pensare che il ciclo di attesa come
l'ho fatto io non sia proprio corretto (che volpe, eh? :-)), però non so
più che pesci prendere: sto guardando l'esempio di Sun sul gioco del Bingo,
ma mi ci sto perdendo.... :-((
Lis


problema è che la Dialog viene disegnata ma non il suo contenuto.
Penso di avere capito l'inghippo: la parte di codice che ho postato viene
richiamata direttamente dall'actionPerformed di un JButton. Quindi viene
eseguito nell'EDT (tra l'altro l'ho verificato anche con
SwingUtilities.isEventDispatchThread()) e per questo motivo finchè non
finisce il ciclo non può aggiornare l'interfaccia grafica.
A questo punto
però non so come risolvere il problema; la prima soluzione che mi è venuta
in mente è di creare un oggetto runnable (implementando anche in lui il
listener dei messaggi che arrivano dal server) che si occupa di tutta la
procedura di login.
Cosa ne pensate? Vi prego, aiutatemi, sono 2 giorni
che ci sto lavorando e non riesco ad ottenere nulla
Lis



Dunque, fammi capire, questa funzionalità di "ascolto messaggi dal server" funziona sempre
oppure no? Cioe', sei sempre in ascolto o solo quando fai il login c'e' la necessita' di
rimanere in attesa?
Io comunque disaccoppiere la gestione del login dal meccanismo di ascolto dei messaggi:
l'ascoltatore dovrebbe essere in grado di inviare in modo asincrono a me dei messaggi, che
io di volta in volta decido come gestire. 
Facciamo finta ad esempio che esista un oggetto trasmettitore ed un ricevitore, la
sequenza potrebbe essere:
0. Creo la finestra di login
1. Mi registro sul ricevitore
2. Mi registro sul bottone di login 
3. Apro la finestra di login
4. Alla pressione del tasto OK invio un messaggio ri richiesta di login al trasmettitore
5. A questo punto l'ascoltatore mi notifichera' l'esito del login, e io potro' di
conseguenza chiudere la finestra e permettere o meno l'accesso al sistema.
Vediamo, provo a scrivere un'abbozzo di codice:
  // 0. creo la finestra di login
  final FinestraLogin login = new FinestraLogin(...);
  // 1. Mi registro sul ricevitore
  ricevitore.addListener(new Listener()
      {
          // 5. Qui si accede quando l'ascoltatore mi notifichera' l'esito login
          public void messageReceived(Message unMessaggio)
          {
              login.nascondi();
              if (unMessaggio.equals(LOGIN_OK))
                  new MenuPrincipale().mostra();
            else
                  ...  // boh, mostra una finestra di errore?
          }
      });
  // 2. Mi registro sul bottone di login 
  login.addActionListener(new ActionListener()
      { 
          // 4. Qui si accede alla pressione del tasto login 
          public void actionPerformed(ActionEvent e)
          { 
              trasmettitore.richiediLogin(login.user(), login.password());
          }
      });
  // 3. mostro la finestra di login, non modale per il codice, ed esco
  login.mostra();
Okay, scusate le inner classes anonime ma c'ho poco tempo :-D
Ovviamente l'interfaccia Listener e la classe Message le devi creare tu (al limite se vuoi
puoi usare ActionListener e ActionEvent, anche se fa un po' schifo :-D), come gli oggetti
ricevitore e trasmettitore
E' sufficiente come indicazione?
Ciao,
    Bruno.
---
| Bruno Bossola
| A Java Software Engineer :-)
| 
http://members.xoom.it/bbruno
| 
http://digilander.iol.it/bbossola

| Bruno Bossola
Ciao



Ma non ti serve :-D! Perche' dovresti? 
Hai guardato il codice che ho postato? Indicami il punto che non ti e' chiaro.
Ciao,
    Bruno,


 ha scritto nel messaggio
news:151Z39Z109Z251Y...@usenet.iol.it...



Il succo e' che questo thread secondario non serve :-)
Ci sono anche soluzioni + eleganti sempre basate su thread (SwingWorker, ad esempio) ma
che affrontano il problema non dal lato giusto: qui si tratta semplicemente di reagire ad
eventi, e se dovessimo creare un thread ogni volta che aspettiamo un evento...!


    Bruno.


    Bruno,
Ciao
Lis
ps. scusate per
l'incolonnamento errato dei post precedenti, ma non ho ancora capito bene
quanto dev'essere la lunghezza massima di una riga postando da iol
