Как я могу сканировать и передавать изображения из устройства подачи документов асинхронно

Какие части связи с TWAIN можно передать в другой поток, например, BackgroundWorker? Или: Можно ли разделить цикл, который обрабатывает передачу изображения?

Некоторые драйверы сканера сканируют все изображения перед возвратом в вызывающее приложение, что заставляет приложение обрабатывать все изображения сразу. Это приводит, например, к OutOfMemoryException или странному поведению в моем приложении WPF, когда внезапно все события (возникающие после каждого сканированного изображения) должны обрабатываться сразу. Кроме того, приложение зависает до завершения передачи.

Я использую TwainDotNet: http://code.google.com/p/twaindotnet/ , но я также ищу общее решение, описывающее фильтр сообщений и взаимодействие с TWAIN независимо от TwainDotNet. Подойдет рабочий процесс, содержащий сообщения TWAIN. Также приветствуются другие языки, предпочтительно что-то вроде C или Deplhi.

  • Закрыть источник данных
  • Отключить фильтр
  • Вызвать событие ScanningComplete
  • , если передача сообщения готова:
    • В цикле (пока ADF не опустеет и т. Д., Это блокирует фильтр сообщений)
      • Получить изображение
      • Преобразовать указатель изображения в GDI + изображение
      • Вызвать событие TransferImage с изображением в качестве параметра
    • Сбросить передачу
    • Закрыть источник данных и т. Д. (Аналогично закрытию сообщения)
  • Уведомить окна о том, что сообщение было обработано
  • Я тестировал это с помощью нескольких сканеров:

    • Fujitsu fi-5120C вызывает событие TransferImage каждый раз, когда страница была перенесена. Изображение сразу появляется в списке изображений в моем приложении WPF.
    • Canon DR-5010C блокирует мое приложение WPF до тех пор, пока все изображения не будут отсканированы (до тех пор, пока цикл не закончится). Windows даже говорит, что приложение WPF не отвечает. После того, как все изображения были переданы, отображается только несколько изображений, и выбор в списке изображений мерцает и т. Д.

    Меня беспокоят не проблемы с отображением, а, скорее, заблокированное окно и проблемы с памятью. Включение цикла, который передает изображения в BackgroundWorker, вызвало несколько сбоев, которые я не смог отладить. Конечно, я рассмотрел проблемы многопоточности WPF. Я также не знаю, как разделить цикл передачи, чтобы после передачи одного изображения программа возвращалась к фильтру сообщений, и сообщение можно было пометить как обработанное.

    6
    задан matthias.lukaszek 14 February 2011 в 16:23
    поделиться