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 dispositivodin=conn.openDataInputStream();InputStreamReaderr=newInputStreamReader(din);intx=36;//Integer.parseInt(JOptionPane.showInputDialog("Especifique o número de caracteres: ")); //aqui especifico o tamanho do barcodeSystem.out.println("AGUARDANDO LEITURA...");intcont=0;StringBuffersb=newStringBuffer();while(cont<x){inti=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?
gibaholms
cara, ao inves de usar um contador, pega o time atual novamente e compara com o time inicial
gustavoRamos
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…
M
marcobiscaro2112
Olha só:
longinicio=System.currentTimeMillis(); // antes de começar, pega o tempo atualwhile(cont<x){inti=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}
}
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
=/
gibaholms
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
M
marcobiscaro2112
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 dispositivodin=conn.openDataInputStream();InputStreamReaderr=newInputStreamReader(din);BufferedReaderbr=newBufferedReader(r);// nova linha!intx=36;//Integer.parseInt(JOptionPane.showInputDialog("Especifique o número de caracteres: ")); //aqui especifico o tamanho do barcodeSystem.out.println("AGUARDANDO LEITURA...");intcont=0;StringBuffersb=newStringBuffer();longinicio=System.currentTimeMillis();// antes de começar, pega o tempo atualwhile(cont<x){inti=0;i=br.read();// alteradosb.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());
gustavoRamos
vou tentar desta forma, quando obter algum resultado posto aqui!
lá vai eu mexer com threads novamente… :shock: :!:
tento fugir mas não consigo… haha
gustavoRamos
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í…
M
marcobiscaro2112
Com Scanner ficaria algo como:
conn=(StreamConnection)Connector.open("btspp://00C01B0C83BD:1;authenticate=false;encrypt=false;master=false");//endereço do dispositivodin=conn.openDataInputStream();InputStreamReaderr=newInputStreamReader(din);Scanners=newScanner(r);// nova linha!// desnecessário//int x = 36;//Integer.parseInt(JOptionPane.showInputDialog("Especifique o número de caracteres: ")); //aqui especifico o tamanho do barcodeSystem.out.println("AGUARDANDO LEITURA...");//int cont=0; desnecessárioStringBuffersb=newStringBuffer();longinicio=System.currentTimeMillis();// antes de começar, pega o tempo atualwhile(s.hasNextInt()){// a condição mudou! inti=sc.nextInt();// alteradosb.append(Character.toChars(i));//System.out.println(cont);//cont++; desnecessárioif((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());