Autore Topic: Implementazione di un TIMEOUT..  (Letto 351 volte)

Offline christian13

  • Utente junior
  • **
  • Post: 83
  • Respect: +2
    • Mostra profilo
Implementazione di un TIMEOUT..
« il: 01 Ottobre 2014, 09:43:58 CEST »
0
Salve a tutti,
nella mia applicazione ho un thread principale e un thread secondario che si occupa della connessione tramite socket e di ricevere dati.
All'interno dello stesso thread secondario, ho un ciclo while nella quale si va ad attendere di ricevere dati...Avrei bisogno di inserire all'interno un semplice "timeout";
--cioè il thread entra nel ciclo e dopo "ad esempio 10 secondi", esce dal ciclo in automatico...

Codice (Java): [Seleziona]
"thread secondario"
.....
.....
while(..){
leggiInput();

//se sono passati 10 secondi esci...


}


Che metodo potrei utilizzare?


Vi ringrazio molto...
« Ultima modifica: 01 Ottobre 2014, 09:47:32 CEST da christian13 »

Offline tonno16

  • Utente storico
  • *****
  • Post: 1228
  • Respect: +59
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Implementazione di un TIMEOUT..
« Risposta #1 il: 01 Ottobre 2014, 10:11:15 CEST »
0
USA la classe CountDown timer.

se metti uno sleep nel thread e decremento un long che rappresenta i millisecondi quindi 10 sec * 1000 fa 10k millisecondi. Se millisecondi uguale a 0 esci e killa il thread.

Offline christian13

  • Utente junior
  • **
  • Post: 83
  • Respect: +2
    • Mostra profilo
Re:Implementazione di un TIMEOUT..
« Risposta #2 il: 01 Ottobre 2014, 19:09:37 CEST »
0
Ti ringrazio molto per la risposta, però non mi è chiarissima....

In pratica all'interno del mio thread secondario devo fare un cosa di questo tipo:

Codice (Java): [Seleziona]
while(true){
String line = br.readLine();
notifica(line);  //chiamata di un metodo che elabora la stringa
}//fine while

In pratica resto sempre in attesa di ricevere una stringa (br sarebbe un bufferedReader di una socket), la stringa ricevuta la passo a un metodo e poi torno in ascolto.
Quello che mi servirebbe è fare in modo che dopo 10 secondi trascorsi dentro al ciclo, in automatico mi esce(ad esempio facendo un "break;").

Come potrei fare?


Offline tonno16

  • Utente storico
  • *****
  • Post: 1228
  • Respect: +59
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Implementazione di un TIMEOUT..
« Risposta #3 il: 01 Ottobre 2014, 19:20:19 CEST »
0
Ci sono molti modi. Magari prima di fare partire il thread creati un oggetto Calendar. Esso ritorna un long che da i millisecondi dell'orario corrente.

Dentro il tuo ciclo guardi se getcurrent millis è maggiore dell'oggetto precedente sommato a 10mila millisecondi.

Se si stoppi il thread.

Comunque credo che esistano librerie dove già puoi settare un timeout. Oppure già nella tua socket (non so magari dico cavolate).

I thread con quel brutto while fanno pena su android. Usare un asynktask?

P.s. sei di ingegneria informatica Cesena?

Offline christian13

  • Utente junior
  • **
  • Post: 83
  • Respect: +2
    • Mostra profilo
Re:Implementazione di un TIMEOUT..
« Risposta #4 il: 01 Ottobre 2014, 19:32:43 CEST »
0
No, studio informatica alla Sapienza a Roma.
Mi sto per laureare e come tesi sto sviluppando un'app Android che comunica con dei sensori sottomarini.
Se devo essere sincero ho cominciato da un mese circa a studiare Android(solo per la tesi) quindi sono consapevole che molti metodi usati non sono al top... :-)

 

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Implementazione di un TIMEOUT..
« Risposta #5 il: 01 Ottobre 2014, 19:49:28 CEST »
0
Se stiamo parlando di BluetoothSocket, il problema della readLine() è che è blocking... blocca tutto fino alla fine della linea.

Un modo per risolvere questo problema senza stare a distruggere thread su timeout e ricrearne subito un altro, l'idea è quella di testare il ready() e in caso affermativo leggere un carattere con read(), quindi ripetere.

Non so se c'è di meglio.

Questo snippet che rende l'idea l'ho trovato cercando con google:
Codice (Java): [Seleziona]
StringBuilder sb = null;
sb = new StringBuilder();
String str;
int numRead = 0;

try {
   if (bufferedReader!=null) {
      if (bufferedReader.ready()) {

         try {
            while ((numRead = bufferedReader.read()) >= 0) {

               //convert asci to char and then to string
               str = String.valueOf((char) numRead);

               if ((str != null)&& (str.toString() != "")) {
                  sb.append(str);
               }

               if (!bufferedReader.ready()){
                  //no more characters to read
                  break;
               }
            }
         } catch (IOException e) {
            e.printStackTrace();
         } catch (Exception e) {
            e.printStackTrace();
         }

         //loop exited, check for null
         if (sb != null) {
            return sb.toString();
         }
      }
   }
} catch (Exception e) {
   e.printStackTrace();
}
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline christian13

  • Utente junior
  • **
  • Post: 83
  • Respect: +2
    • Mostra profilo
Re:Implementazione di un TIMEOUT..
« Risposta #6 il: 02 Ottobre 2014, 09:57:01 CEST »
0
Grazie mille per la risposta.

Vi chiedo un altro consiglio (modificando l'implementazione che ho descritto).

-->Il thread principale avvia il thread secondario che resta in ascolto di ricevere dati tramite "in.readLine()"quindi bloccante, e allo scadere di un tempo prefissato (ad esempio 10 secondi) il thread secondario si auto-distrugge o viene ucciso dal thread principale, indifferente...

come può essere implementato questo meccanismo di "uccisione" del thread secondario dopo un tot. di tempo?

Vi ringrazio molto per la collaborazione.
« Ultima modifica: 04 Ottobre 2014, 11:57:00 CEST da christian13 »