PDA

Ver la Versión Completa : Terminar una funcion en un tiempo


carlmasa
12-06-2008, 09:29:44
Buenos días a todos.

Os explico mi problema: Tengo un componente en el que cargo un fichero PDF para poder procesarlo, el problema radica en que hay algunos ficheros que no estando corruptos (se pueden abrir con el Adobe) se me queda pegado el programa intentando abrirlo. Me gustaría saber como hacer para que si en un cierto tiempo no se ha podido abrir me devuelva el control o mate ese proceso.

El código que utilizo es muy sencillo:

for i := 0 to NumeroDeFicheros do
begin
try
micomponente.Filename := NombreFichero;
.....
except
......
end;
end;

He estado viendo la función "WaitForSingleObject" pero no se como usarla con un componente.

Un saludo y muchas gracias

Lepe
12-06-2008, 11:19:25
Habría que conocer mejor ese componente que usas.

Si se queda "pegado el programa" añade un Application.ProcessMessages dentro del bucle, antes de asignar el nombre de archivo.

El problema suponto que viene porque el componente no lanza excepciones y si tarda mucho, es normal que se paralice.

Si no sirve nada, igual creando varios hilos, puedes lograrlo, pero se va a complicar, primero sería conveniente saber si el componente tiene un método CancelarProcesado o algo así, podría solucionarse con un botón Cancelar ;).

¿nombre del componente?
¿tienes el código fuente?

Saludos

carlmasa
12-06-2008, 12:22:32
Buenas Lepe.

El Application.ProcessMessage ya lo tengo puesto antes de cargar el fichero. El problema radica en que a la hora de cargar el fichero, éste debe tener algo que impide que termine de cargarse. Incluso el Timer que tengo puesto se queda parado.
El componente se llama PDFToolkit de la casa Gnostice y no tengo el código fuente ya que la empresa lo compró sin él (listos que son ellos :D).
Me da la impresión que la única manera va a ser a través de hilos (aunque lo veo peligroso ya que tengo que recorrerme unos 18.000 pdf y se puede quedar el ordenador ko) o bien a través de funciones del tipo "WaitForSingleObject". Lo malo es que nunca he trabajado con ninguno de los dos.

Un saludo.

Crandel
12-06-2008, 14:57:11
Creo que tienes dos opciones para solucionar el problema:

1. Normalmente cuando uno compra un componente tiene la ventaja de poder contactarse con el soporte y este momento lo amerita. Explicales el problema y que te den una solucion.

2. Abrir cada documento en su propio hilo. Como se hace cuando tenes muchos archivos ? Creas una clase manejadora de hilos, entonces cada vez que necesitas crear un nuevo hilo, en vez de crearlo se lo pides a esa clase. A su vez la clase tiene definido un numero maximo de hilos a crear. Entonces si la clase tiene un hilo libre te lo entrega. Si en cambio estan todos ocupados pero no se llego a la cantidad maxima, lo crea y te lo entrega.

Saludos

carlmasa
12-06-2008, 15:08:59
Con lo de ponerme en contacto con el servicio técnico ya lo he probado y que si quieres arroz catalina (estos yanquis están locos), así que veo que no me va a quedar más remedio que ponerme a estudiar los threads ya que nunca los he utilizado.

Muchas gracias.