Newsgroup: it.comp.java
Titolo: (URGENTE) Come far si che InputSream non blocchi il resto del programma???

Sto realizzando una sorta di ICQ in Java, nel il Client deve ovviamente
essere sempre in ascolto di qualche messaggio (utilizzando gli Stream e i
Socket) e al tempo stesso poter effettuare altre operazioni.
Ora se io mi metto in ascolto in questo modo:
while (true)
{
    temp = in.readLine();
    if (temp !=) null
    {
        // Azioni da svolgere nel caso arrivi un messaggio..
    }
}
In questo modo però praticamente il programma non mi consente di fare
altro...
Una soluzione potrebbe essere quella di inserire in ogni ciclo while un
ritardo ad esempio un sec. in modo da creare una sorta di multitasking, che
ne dite???
Avete altre soluzioni???
Grazie
--
-----------------------------------------------
Andrea Sistarelli - Terni - Italy
sis...@tiscalinet.it
si...@wappi.com
 - Per un SMS sul cellulare
ICQ: 11598516
-----------------------------------------------
Vuoi guadagnare mentre navighi????
Registrati su Spedia a questo indirizzo:
http://www.spedia.net/cgi-bin/tz.cgi?run=show_svc&fl=8&vid=413335

 ha scritto nel messaggio
news:85km7t$mdk$1...@lacerta.tiscalinet.it...


 Socket) e al tempo stesso poter effettuare altre operazioni.
Bene, allora il ciclo principale del programma lancerà un thread che si metterà
in lettura sul socket di ingresso; quando avrà letto sufficienti dati per
compiere una qualsiasi azione lo farà. Nel contempo il resto del programma sarà
libero di fare quel che deva fare. Ovviamente occhio a sincronizzare i metodi
nel caso alcune variabili debbano essere utilizzate sia dal thread che
controlla i dati in ingresso che dal resto del programma!
Ciao,
 Stefano
----------
"X WindowSSS, teSSSoro mio... lo odieremo per SSSempre"
Bill Gollum
----------

 controlla i dati in ingresso che dal resto del programma!
Ok.. ho risolto in parte..
Il problema è che dalla classe principale (per capirci quella che genera il
thread) quando si scelgo delle voci di menù viene inviato un messaggio al
server il quale risponde con più messaggi:
CLIENT
- Send message to server
- Receive message from server
- Receive message from server
- Receive message from server;
Queste operazioni vengono svolte all'interno in un metofo void.
Il problema è che talvolta alcuni messaggi di risposta dal server vengono
catturati dal threa invece che dal metodo...
Ho provato ad usare il metodo suspend/resume del thread ma non sono riuscito
a risolvere il problema...



Prova con il multithread
Ciao
De giorgis michele

Metti il thread in wait dopo che ha ottenuto il messaggio e genera su di
esso un interrupted al momento in cui dovrą riprendere ad ascoltare. Nel
tread inserisci un InterruptedException nel catch.
pan...@edmaster.it

 a risolvere il problema...
Beh il mio consiglio sarebbe stato e rimane quello di far gestire QUALSIASI COSA
che provenga dal server dal tuo thread. Immagino che a seconda di quello che il
server riceva abbia da chiamare una o più funzioni. Allora se tu dalla
applicazione principale richiami un menù che invia una qualche richiesta al
server, sarà il thread a ricevere le risposte, e in base a quel che riceve farà
un 'dispatching' dei vari dati; al limite li fai precedere da una breve
intestazione che spieghi che tipo di dati sia arrivato... cioè
- Send message to server (thread principale)
- Receive message from server (thread secondario)
    intestazione = recupero_intestazione();
    dati = recupero_dati();
    controllo_intestazione() - Ah-ah! E' di tipo x! Chiamo gestore_x(dati)
    Oppure: E' di tipo y! Chiamo gestore_y(dati)
    E così via...
    Ovviamente se non è pensabile di recuperare e tenere i dati in memoria,
all'interno di gestore_x() ci sarà una funzione che si occuperà di leggerli ed
elaborarli.
- Receive message from server
- Receive message from server;
    si comportano come sopra.


 controlla i dati in ingresso che dal resto del programma!
Come ho già scritto nell altro messaggio ho risolto almeno in parte il
problema in un modo molto poco elegante...
Comunque una volta che ho creato un thread che è sempre in ascolto tutto
funziona perfettamente, il problema nasce quando a seguito si una selezione
di una voce di menù da parte dell'utente viene avviata una procedura che
invia un messaggio al server e aspetta la risposta (che è formata da più
messggi) a questo punto succede che alcuni messaggi vengono ricevuti da
questa procedura mentre altri dal thread...
Ho provato a inserire Application1.client_thread.suspend() all'inizio della
procedura ma il programma in pratica si pianta...
Allora ho provato a modificare la classe thread in questo modo:
=============================================
package Client;
public class Chat_Thread extends Thread
{
  String temp;
  public Chat_Thread()
  {
  }
  public void run()
  {
    while (true)
    {
      if (Application1.ascolto)
      {
        temp = null;
        try
        {
          if (Application1.client.in.ready())
            temp = Application1.client.in.readLine();
        }
        catch (Exception ex)
        {
        }
        if ( temp != null)
          Application1.client.Messaggio_ricevuto(temp);
      }
    }
  }
=============================================
In questo modo quando voglio sospende temporaneamente il thread basta che
imposto la variabile Application1.ascolto = false, quando voglio riprenderlo
la imposta a true...
Così facendo sembra funzionare tutto regolarmente anche se in questo modo il
programma viene rallentato un pò...
Avete altri suggerimenti su come poter risolvere il problema in un modo un
pò più elegante???


Ok, ho risolto il problema e tutto sembra funzionare perfettamente..
Ora mi chiedo una cosa, è necessario quando esco dal programma chiudere/terminare il thread oppure si chiude automaticamente??


 Ora mi chiedo una cosa, è necessario quando esco dal programma chiudere/terminare il thread oppure si chiude automaticamente??
La JVM esce se tutti i thread rimasti sono thread demoni (normalmente i tuoi thread non lo sono a meno che non li forzi tu, con
Thread.setDaemon(true)), quindi se setti il tuo thread (di risposta al server) a demone, quando il thread principale finirà la JVM
uscirà. Se non lo fai, la JVM rimarrà attiva, avendo un thread sempre attivo (quello che attende le risposte dal server). In
alternativa, puoi sempre fare una System.exit(), che forza l'uscita della JVM. (Il tutto sempre che la policy di sicurezza
permetta modifiche ai thread e la System.exit(), normalmente si)
