Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] Intentando un TimeOutException

Estas en el tema de Intentando un TimeOutException en el foro de Java en Foros del Web. Hola, Tengo un problema con un fragmento de código para el control de una impresora. El problema ocurre tanto solicitando el estado de la impresora ...
  #1 (permalink)  
Antiguo 28/04/2016, 05:13
 
Fecha de Ingreso: octubre-2013
Mensajes: 31
Antigüedad: 10 años, 6 meses
Puntos: 0
Intentando un TimeOutException

Hola,

Tengo un problema con un fragmento de código para el control de una impresora.

El problema ocurre tanto solicitando el estado de la impresora como si lanzo una impresión y la impresora no esta activa. El problema de este error es que me bloquea el programa durante un tiempo bastante grande. Si todo esta correcto el código se ejecuta en menos de 10ms, pero si no detecta la impresora tarda más de 10 segundos.

La idea es que si transcurridos 50ms lanzar una excepción de tiempo, pero desconozco completamente como hacerlo.

la idea es algo así:
Código:
boolean estado_impresora = false;

funcion ()
{
try{
//código de testeo de estado impresora
estado_impresora = true;
}
catch(TimeOutException){estado_impresora = false;}// lanzar la excepción si transcurre más tiempo del deseado.
}//fin funcion
Un saludo y gracias anticipadas
  #2 (permalink)  
Antiguo 28/04/2016, 05:42
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Intentando un TimeOutException

El timeoutException lo estará lanzando el método que usas para intentar conectarte a la impresora. Sin saber que clase y método estás usando para ello es imposible saber como cambiar el tiempo de timeout.
__________________
Aviso: No se resuelven dudas por MP!
  #3 (permalink)  
Antiguo 28/04/2016, 06:18
 
Fecha de Ingreso: octubre-2013
Mensajes: 31
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Intentando un TimeOutException

gracias por responder,

Este es el código que tengo separado para hacer las pruebas de funcionamiento:

Código:
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.ExecutionException;


void setup(){

ExecutorService executor = Executors.newSingleThreadExecutor();

  Future future = null;
        try{try{try {
           future = executor.submit(new intenta_impresion2());
            System.out.println("Started..");
            System.out.println(future.get(3, TimeUnit.SECONDS));
            intenta_impresion2 AAA = new intenta_impresion2(); AAA.run();
            System.out.println("Finished!");
        } catch (TimeoutException e) {
            future.cancel(true);
            System.out.println("Terminated!");
        }
} catch (InterruptedException ew) {println("TIMEOUT");}
} catch (ExecutionException e3w) {println("TIMEOUT");}

        executor.shutdownNow();
println("(");


}
 



public class intenta_impresion2 implements Runnable{
  
  
  public intenta_impresion2(){println("KKIHJI");
  
      try{ PrintService defServ = PrintServiceLookup.lookupDefaultPrintService();
     System.out.println("Default PrintService: "+defServ);

     PrintService[] serv = PrintServiceLookup.lookupPrintServices(null, null);
     if (serv.length==0) {
         System.out.println("no PrintService  found");
     } else {
         System.out.println("number of Services "+serv.length);
     }


     for (int i = 0; i<serv.length ;i++) {
         PrintServiceAttributeSet psa = serv[i].getAttributes();
         System.out.println("printer name "+(i+1)+" "+psa.get(PrinterName.class));
         System.out.println("accepting "+psa.get(PrinterIsAcceptingJobs.class));
     }
         }catch(Exception e){}    
     
  
  println("UKSJJHSU");
  }
    public void run() {
println("IK");  }

}

El código funciona a la perfección, el problema es que se queda pillado al ejecutar la linea:
Código:
PrintServiceAttributeSet psa = serv[i].getAttributes();
Si detecta la impresora no se bloquea, pero en caso contrario (es una impresora en red conectada a un usb del router y un programa de tp-link es el que envía los datos), hay que esperar 20-50 segundos.
´
No detecto que lance la consola una excepción de tiempo. He leido algo de que es un bug:
http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6181488

Pero estoy usando Windows, así que no estoy seguro de que sea eso.

El código no hace saltar la excepción de tiempo, así que no se como se puede hacer.
  #4 (permalink)  
Antiguo 28/04/2016, 06:33
 
Fecha de Ingreso: octubre-2013
Mensajes: 31
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Intentando un TimeOutException

El código que he puesto es el que se puede usar para ver si la impresora acepta trabajo. Si intento imprimir directamente saltan estas excepciones después de un bloqueo de unos 10 segundos:
Código:
javax.print.PrintException: Printer is not accepting job.
	at sun.print.Win32PrintJob.print(Unknown Source)
	at Programa_impresion.REimprimir_documento(controlando_nuevas_impresoras88_error_impresion_bloqueo.java:18788)
	at Programa_impresion.intenta_impresion(controlando_nuevas_impresoras88_error_impresion_bloqueo.java:18741)
	at Programa_impresion.draw(controlando_nuevas_impresoras88_error_impresion_bloqueo.java:1143)
 	at processing.core.PApplet.handleDraw(PApplet.java:2390)

	at processing.core.PGraphicsJava2D.requestDraw(PGraphicsJava2D.java:245)
	at processing.core.PApplet.run(PApplet.java:2260)
	at java.lang.Thread.run(Unknown Source)
  #5 (permalink)  
Antiguo 28/04/2016, 07:37
 
Fecha de Ingreso: octubre-2013
Mensajes: 31
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Intentando un TimeOutException

Otra cosa que sucede y que pienso que es lo que produce el error es esto:

Código:
Windows: No se puede mostrar las propiedades de impresión. No se pudo completar la operación (error 0x00002ef3)
Ese mensaje aparece cuando me conecto a una red diferente a la de la impresora e intento ver sus propiedades.
  #6 (permalink)  
Antiguo 05/05/2016, 15:48
 
Fecha de Ingreso: octubre-2013
Mensajes: 31
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Intentando un TimeOutException

Bueno, solucione el problema lanzando un hilo paralelo:
Código:
void setup(){
        ThereadOK AAA = new ThereadOK("testing");
        AAA.start();   
    }
    int i = 0;
void draw()
{
  println(i); i++; delay(500);
}


public class ThereadOK extends Thread {
    public ThereadOK(String str) {
        super(str);
    }
    public void run() {
      try{   
        println(getName());delay(10000);println(getName());
      }catch(Error e){}
    }
}

Etiquetas: programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:59.