Limitar tempo do processo

Olá pessoal,

Estou construindo uma aplicação em que uso um leitor de códigos de barra bluetooth.
quanto à comunicação com ele já está tudo ok, porém para que eu faça uma leitura de um código de barras tenho de especificar o tamanho do código de barras, o que acho meio chato. O que estou tentando fazer agora é limitar o tempo
em que o meu DataInputStream fique naquele método read().

já tentei de algumas maneiras, e vi que existe um método que pega o tempo atual da máquina:

System.currentTimeMillis();

pensei em uma maneira de pegar esse método e somar um tempo a mais (tipo uns 2000 milisegundos) para limitar o processo, dentro de um desvio ou um laço. mas até agora não tive um bom resultado. Se alguém tiver uma idéia posta aí! (:

abaixo, meu código para que não haja dúvidas no que estou tentando fazer… (neste algoritmo ainda tenho de especificar o tamanho do código de barras)

conn = (StreamConnection) Connector.open("btspp://00C01B0C83BD:1;authenticate=false;encrypt=false;master=false"); //endereço do dispositivo
            din = conn.openDataInputStream();
            InputStreamReader r = new InputStreamReader(din);

            int x = 36;//Integer.parseInt(JOptionPane.showInputDialog("Especifique o número de caracteres: ")); //aqui especifico o tamanho do barcode

            System.out.println("AGUARDANDO LEITURA...");                         

            int cont=0; 

            StringBuffer sb = new StringBuffer();        
            
            while(cont<x){                    
                    int i=0;
                    i = r.read();
                    sb.append(Character.toChars(i));
                    //System.out.println(cont);
                    cont++;
                
            }

           System.out.println("Contador: "+cont+"\nCódigo: "+sb.toString());

Você quer que o bloco while não dure mais de 2 segundos, por exemplo? E outra coisa: qual API ou framework você está utilizando para a leitura dos dados?

cara, ao inves de usar um contador, pega o time atual novamente e compara com o time inicial

pessoal obrigado por responder… =)

é isso mesmo, não quero que passe de 2 segundos de leitura. uso para leitura o java.io

e eu já tentei usar com o time , mas não deu certo, o laço ficou esperando o processo de leitura terminar, para depois comparar o tempo, o que não pode acontecer… o que quero é dar um ‘break’ da vida para parar o precesso no meio da leitura, quando esgotar o tempo…

Olha só:

            long inicio = System.currentTimeMillis(); // antes de começar, pega o tempo atual
            while(cont<x){                    
                    int i=0;
                    i = r.read();
                    sb.append(Character.toChars(i));
                    //System.out.println(cont);
                    cont++;
                    if ((System.currentTimeMillis() - inicio) > 2000) {
                        break; // se o tempo decorrido for maior que 2000 sai do laço
                    }
            }

[quote]Olha só:


   1. long inicio = System.currentTimeMillis(); // antes de começar, pega o tempo atual  
   2. while(cont<x){                      
   3.         int i=0;  
   4.         i = r.read();  
   5.         sb.append(Character.toChars(i));  
   6.         //System.out.println(cont);  
   7.         cont++;  
   8.         if ((System.currentTimeMillis() - inicio) > 2000) {  
   9.             break; // se o tempo decorrido for maior que 2000 sai do laço  
  10.         }  
  11. }  

[/quote]

marcobiscaro2112, obrigado pela resposta! Porém , já fiz dessa forma e não deu o resultado esperado, porque quando se chama aquele método:

...
i = r.read();  
...

ele fica esperando ler alguma coisa pra depois partir pros próximos passos, e é exatamente ali que eu não quero que ultrapasse 2 segundos de espera
=/

vixi cara… vc quer parar o processo de leitura… ai seria melhor fazer a leitura em uma thread separada e ir monitorando ela a partir de uma trhead principal… ai seria o unico jeito da thread principal pode matar a outra thread no meio do metodo

Já tentou usar a classe Scanner ou BufferedReader? Me parece que o método read() de InputStreamReader espera todos os dados serem carregados (ou algo assim). Com BufferedReader você tem um buffer que vai recebendo dados gradativamente, o que deixa a aplicação mais eficaz, e talvez não “trave” em determinada linha. Seria algo como:

conn = (StreamConnection) Connector.open("btspp://00C01B0C83BD:1;authenticate=false;encrypt=false;master=false"); //endereço do dispositivo
            din = conn.openDataInputStream();
            InputStreamReader r = new InputStreamReader(din);
            BufferedReader br = new BufferedReader(r); // nova linha!

            int x = 36;//Integer.parseInt(JOptionPane.showInputDialog("Especifique o número de caracteres: ")); //aqui especifico o tamanho do barcode

            System.out.println("AGUARDANDO LEITURA...");                         

            int cont=0; 

            StringBuffer sb = new StringBuffer();      
  
            long inicio = System.currentTimeMillis(); // antes de começar, pega o tempo atual

            while(cont<x){                    
                    int i=0;
                    i = br.read(); // alterado
                    sb.append(Character.toChars(i));
                    //System.out.println(cont);
                    cont++;
                    if ((System.currentTimeMillis() - inicio) > 2000) {
                        break; // se o tempo decorrido for maior que 2000 sai do laço
                    }
            }            
           
           System.out.println("Contador: "+cont+"\nCódigo: "+sb.toString());

vou tentar desta forma, quando obter algum resultado posto aqui! :slight_smile:

lá vai eu mexer com threads novamente… :shock: :!:
tento fugir mas não consigo… haha

marcobiscaro2112 , já usei com buffered reader também! com Scanner não. mas o que pude perceber é que os métodos read() de todos esperam que algo como… um enter (seilá)… pra que o processo de leitura termine, e o meu leitor de barcode justamente não tem esse tal ‘enter’ que termine … ele continua executando de tal maneira que tem que ser a minha aplicação de termine com o read() do leitor, ele não sabe fazer isso por conta própria…

se estou errado me corrijam, mas é isso que concluí…

Com Scanner ficaria algo como:

conn = (StreamConnection) Connector.open("btspp://00C01B0C83BD:1;authenticate=false;encrypt=false;master=false"); //endereço do dispositivo
            din = conn.openDataInputStream();
            InputStreamReader r = new InputStreamReader(din);
            Scanner s = new Scanner(r); // nova linha!
            // desnecessário
            //int x = 36;//Integer.parseInt(JOptionPane.showInputDialog("Especifique o número de caracteres: ")); //aqui especifico o tamanho do barcode

            System.out.println("AGUARDANDO LEITURA...");                         

            //int cont=0; desnecessário

            StringBuffer sb = new StringBuffer();      
  
            long inicio = System.currentTimeMillis(); // antes de começar, pega o tempo atual

            while(s.hasNextInt()){ // a condição mudou! 
                    int i= sc.nextInt(); // alterado
                    sb.append(Character.toChars(i));
                    //System.out.println(cont);
                    //cont++; desnecessário
                    if ((System.currentTimeMillis() - inicio) > 2000) {
                        break; // se o tempo decorrido for maior que 2000 sai do laço
                    }
            }            
           
           System.out.println("Contador: "+cont+"\nCódigo: "+sb.toString());