DelphiTwain: как узнать, что сканирование из фидера завершено

Я использую компонент TDelphiTwain для сканирования. Когда я запускаю сканирование из устройства подачи, все сканирование выполняется асинхронно, и событие OnTwainAcquire запускается, когда новое изображение доступно для обработки. Но я не могу найти, как проверить, что сканирование всех документов уже завершено. Когда лоток податчика пуст, сканирование останавливается, и если я помещаю новые бумаги в податчик, он не обрабатывает их. Поэтому мне нужно знать, что он закончен, и я могу обрабатывать полученные изображения. Я могу проверить, что фидер пуст, но я могу легко пропустить (моим чеком) момент, когда трей был пуст, поэтому приложение будет думать, что приходят новые изображения, но это не так. Я предполагал, что для такой задачи должны быть какие-то события (StartSession/StopSession), но я не могу их найти.

в коде это выглядит так:

procedure TFormDemo.FormShow(Sender: TObject);
begin
  Twain := TTwainScanner.Create;
  Twain.OnTwainAcquire := Acquire;
  Twain.Source[SelectedDevice].SetFeederEnabled(True);
  Twain.Source[SelectedDevice].Enabled := True; // start
end;

procedure TFormDemo.Acquire(Sender: TObject; const Index: Integer;
  Bitmap: TBitmap; var Cancel: Boolean);
begin
  // some processing
  Cancel := False;
end;

Я также перехватываю событие OnAcquireProgress, но это ход текущего сканирования изображения, и это не помогает узнать, когда сканирование было остановлено.

ОБНОВЛЕНИЕ: я почти нашел решение. Когда TTwainSource завершает обработку событий TWAIN, он устанавливает ENABLED=false для TTwainsource. К сожалению, внутри OnTwainAcquire это все еще True, позже оно стало False, и нет события, где я мог бы это проверить. Как обходной путь, я могу проверить его по таймеру.


person Andrei Galatyn    schedule 16.08.2013    source источник
comment
Я нашел этот старый код, который я больше не могу тестировать: Twain.Source[x].EnableSource(True, True); в то время как Twain.Source[x].Enabled делает Application.ProcessMessages; Когда цикл while завершается, вы знаете, что сканирование завершено. Это не оптимальная стратегия, но она может решить вашу проблему. Вместо этого вы можете написать таймер, который проверяет, включен ли источник, или поместить весь процесс в поток, чтобы избежать использования Application.ProcessMessages.   -  person Erik Virtel    schedule 16.08.2013


Ответы (1)


Я использовал DelphiTwain отсюда http://www.kluug.net/delphitwain.php Автор согласился добавить новое событие, так что с обновленной версией библиотеки проблема была решена.

person Andrei Galatyn    schedule 19.08.2013