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! 
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());