2010-12-15 7 views
6

¿Qué partes de la comunicación con TWAIN se pueden poner en otra conversación, p. Ej. un BackgroundWorker? O: ¿Es posible dividir el bucle que maneja la transferencia de imágenes?¿Cómo puedo escanear y transferir imágenes desde un alimentador de documentos de forma asíncrona?

Algunos controladores de escáner escanean todas las imágenes antes de volver a la aplicación de llamada, lo que obliga a la aplicación a manejar todas las imágenes a la vez. Esto da como resultado, p. OutOfMemoryException o comportamiento extraño en mi aplicación WPF cuando de repente todos los eventos (surgidos después de cada imagen escaneada) tienen que ser manejados a la vez. Además, la aplicación se cuelga hasta que se completa la transferencia.

Estoy usando TwainDotNet: http://code.google.com/p/twaindotnet/ pero también estoy buscando una solución genérica que describa el filtro de mensajes y la interacción con TWAIN independiente de TwainDotNet. Un flujo de trabajo que contenga los mensajes TWAIN sería suficiente. Otros idiomas también son bienvenidos, preferible algo como C o Deplhi.

La implementación actual del filtro de mensajes en DataSourceManager se puede describir de la siguiente manera: mensajes de información

  • obtener de identificador de ventana (hwnd)
  • filtro complican, enviar cosas para TWAIN etc.
  • si mensaje de cierre (por ejemplo, al pulsar el botón de cancelar en el TWAIN UI)
    • fuente cercana datos
    • filtro Disable
    • Call caso ScanningComplete
  • si la transferencia de mensajes listo:
    • En un bucle (hasta que el ADF está vacío, etc., esto bloquea el filtro de mensajes)
      • obtener una imagen
      • Convertir puntero a imagen GDI +
      • Call caso TransferImage con la imagen como parámetro
    • transferencia de reinicio
    • Cerrar fuente de datos, etc. (igual que el mensaje de cierre)
  • notifica Windows, que el mensaje tiene sido manejado

He probado esto con sever al escáner:

  • Un Fujitsu fi-5120C llama al evento TransferImage cada vez que se transfiere una página. La imagen aparece de inmediato en una lista de imágenes en mi aplicación WPF.
  • Una Canon DR-5010C bloquea mi aplicación WPF hasta que todas las imágenes se hayan escaneado (hasta que termine el ciclo). Windows incluso dice que la aplicación WPF no responde.Después de todas las imágenes han sido transferidos, sólo unos pocos se muestran las imágenes y la selección en la lista de imagen parpadea etc ..

No estoy preocupado por los problemas de la pantalla, sino más bien de la ventana bloqueado y los problemas de memoria. Poner el bucle que transfiere las imágenes en un BackgroundWorker causó varios bloqueos, que no pude depurar. Por lo que consideré los problemas de enhebrado de WPF. Tampoco sé cómo dividir el bucle de transferencia, de modo que, después de transferir una imagen, el programa vuelve al filtro de mensajes y el mensaje se puede marcar como manejado.

+0

¿Has pensado en preguntarle al grupo de desarrolladores de TwaindotNet? [Http://groups.google.com/group/twaindotnet-devs?pli=1](http://groups.google.com/group/twaindotnet-devs?pli=1) – ascarb

+0

Busco un genérico solución que describe el filtro de mensajes y la interacción con TWAIN independiente de TwainDotNet. Un flujo de trabajo que contenga los mensajes TWAIN sería suficiente. Otros idiomas también son bienvenidos, preferible algo como C o Deplhi. –

Respuesta

8

Trabajo para Atalasoft, pero no sé WPF, o incluso mucho acerca de DotTwain!

te puedo decir que, en general escaneo TWAIN se puede hacer en un hilo de exploración por separado, pero hay que tener cierto cuidado. El enfoque más simple es hacer todas las operaciones TWAIN en el hilo de escaneo: no mezcle las llamadas TWAIN entre dos hilos.

hilo

La exploración tiene que tener un suministro de mensajes o ser un hilo 'interfaz de usuario', lo que lleva en su entorno. No es solo un hilo de trabajo.

TWAIN espera ser dado un identificador de ventana (anticuada Win32 HWND) para su uso como la ventana principal de la interfaz de usuario del escáner. Recomiendo crear una ventana 'escanear padre' para este propósito, en el hilo de escaneo. Puede hacer que sea visible o no como lo desee, y destruirlo al final del trabajo de escaneo.

Si sus trabajos de escaneado pueden ser muy grandes (por ejemplo, 50 páginas de 400 ppp en color) usted tiene que asegurarse de que el proceso de exploración no se llene la memoria lógica ya sea o RAM. Si llena la memoria lógica (un proceso de Windows de 32 bits obtiene aproximadamente 2 GB de espacio de direcciones para trabajar) las asignaciones fallarán. Si llena RAM, el código que está consumiendo/eliminando las imágenes entrantes puede comenzar a intercambiarse, ralentizándose radicalmente, luego el escaneo se ejecuta y llena la memoria lógica. Así que hay que o bien:

  1. Completamente proceso y disponer de cada imagen entrante en la exploración hilo, o
  2. estrangular el flujo de imágenes desde el subproceso de exploración por lo que no puede correr demasiado lejos de su procesamiento /disposición.

Normalmente encuentro que quiero poder cancelar el hilo de escaneo, lo que requiere un poco de paciencia ya que las llamadas TWAIN no se pueden interrumpir, y algunas de ellas son pesadas. Como habrás notado con tu Canon. Por otro lado, si fuerza un subproceso dentro de una llamada TWAIN, el escáner puede requerir un ciclo de encendido o incluso un reinicio del sistema, y ​​TWAIN bloqueará hasta que el DLL del administrador TWAIN se descargue de la memoria y se vuelva a cargar. Por lo general, es mejor cerrar TWAIN muy educadamente.

Cuestiones relacionadas