2010-12-15 18 views
6

Które części komunikacji z TWAIN można umieścić w innym wątku, np. a BackgroundWorker? Lub: Czy można podzielić pętlę, która obsługuje przesyłanie obrazów?Jak skanować i przesyłać obrazy z podajnika dokumentów asynchronicznie?

Niektóre sterowniki skanera skanują wszystkie obrazy przed powrotem do aplikacji wywołującej, która wymusza na aplikacji obsługę wszystkich obrazów naraz. Powoduje to np. OutOfMemoryException lub dziwne zachowanie w mojej aplikacji WPF, gdy nagle wszystkie zdarzenia (wywołane po każdym zeskanowanym obrazie) muszą być obsługiwane jednocześnie. Dodatkowo aplikacja zawiesza się do momentu zakończenia transferu.

Używam TwainDotNet: http://code.google.com/p/twaindotnet/, ale szukam również ogólnego rozwiązania opisującego filtr wiadomości i interakcję z TWAIN niezależnym od TwainDotNet. Przepływ pracy zawierający komunikaty TWAIN byłby wystarczający. Inne języki są również mile widziane, preferowane jest coś takiego jak C lub Deplhi.

Obecna implementacja filtru wiadomości w DataSourceManager można opisać w następujący sposób:

  • Get Info wiadomości z uchwytu okna (HWND)
  • filtra komplikować, wysyłać rzeczy do TWAIN itp
  • jeśli komunikat blisko (np po naciśnięciu przycisku anuluj w TWAIN UI)
    • źródło zbliżone dane
    • Wyłącz filtr
    • połączeń wydarzenie ScanningComplete
  • jeśli przelew wiadomość gotowe:
    • w pętli (do automatycznego podajnika dokumentów jest pusta itd., To blokuje filtr wiadomości)
      • Get image
      • Konwersja wskaźnika obrazu na obraz GDI +
      • połączeń wydarzenie TransferImage z obrazem jako parametr
    • przeniesienie reset
    • Blisko źródła danych itp (tak samo jak wiadomości zamknij)
  • Zawiadom okna, że ​​wiadomość ma został obsłużony

Testowałem to z sever Skanery al:

  • Fujitsu fi-5120C wywołuje zdarzenie TransferImage za każdym razem, gdy strona została przesłana. Obraz pojawia się natychmiast na liście obrazów w mojej aplikacji WPF.
  • Canon DR-5010C blokuje moją aplikację WPF, dopóki wszystkie obrazy nie zostaną zeskanowane (do zakończenia pętli). Windows nawet mówi, że aplikacja WPF nie odpowiada.Po przeniesieniu wszystkich obrazów wyświetlanych jest tylko kilka zdjęć, a wybór na liście obrazów migocze, itp.

Nie przejmuję się problemami z wyświetlaniem, ale raczej blokowaniem okna i problemami z pamięcią. Umieszczenie pętli, która przenosi obrazy do BackgroundWorker, spowodowało kilka awarii, których nie mogłem debugować. Z tego powodu zastanawiałem się nad wątkami WPF. Nie wiem również, jak podzielić pętlę transferu, tak aby po przeniesieniu jednego obrazu program powrócił do filtra wiadomości, a wiadomość może zostać oznaczona jako obsługiwana.

+0

Czy zastanawiałeś się nad zapytaniem grupy programistów TwaindotNet? [Http://groups.google.com/group/twaindotnet-devs?pli=1](http://groups.google.com/group/twaindotnet-devs?pli=1) – ascarb

+0

szukam rodzajowe rozwiązanie opisujące filtr wiadomości i interakcja z TWAIN niezależnym od TwainDotNet. Przepływ pracy zawierający komunikaty TWAIN byłby wystarczający. Inne języki są również mile widziane, preferowane jest coś takiego jak C lub Deplhi. –

Odpowiedz

8

pracuję Atalasoft, ale nie wiem, WPF, a nawet, że dużo o DotTwain!

mogę powiedzieć, że ogólnie skanowanie TWAIN można zrobić na osobnym wątku skanowania, ale trzeba poświęcić trochę opieki. Najprostszym sposobem jest wykonanie wszystkich operacji TWAIN na wątku skanowania - nie mieszaj wywołań TWAIN między dwoma wątkami.

Skanowanie wątek ma mieć pompę wiadomość lub być wątek UI „”, cokolwiek to odbywa się w danym środowisku. To nie jest tylko wątek roboczy.

TWAIN spodziewa się otrzymać uchwyt okna (staromodny Win32 HWND) do wykorzystania jako okna nadrzędnego dla interfejsu skanera. Zalecam utworzenie w tym celu okna "rodzic skanowania" na wątku skanowania. Możesz uczynić ją widoczną lub nie, tak jak chcesz, i zniszczyć ją na końcu zadania skanowania.

Jeśli zadania skanowania mogą być bardzo duże (na przykład 50 stron 400 dpi kolor), musisz upewnić się, że proces skanowania nie wypełnia się albo logicznej pamięci lub pamięci RAM. Jeśli zapełnisz pamięć logiczną (32-bitowy proces systemu Windows pobiera około 2 GB przestrzeni adresowej do pracy) przydzielanie zakończy się niepowodzeniem. Jeśli zapełnisz pamięć RAM, kod zużywający/utylizujący przychodzące obrazy może zacząć się zamieniać, spowalniając radykalnie, a skanowanie przebiega naprzód i wypełnia pamięć logiczną. Więc trzeba albo:

  1. Całkowicie proces i wyrzucać każdego obrazu wejściowego na skanie wątku lub
  2. przepustnicy przepływ obrazów z wątku skanowania więc nie można uruchomić zbyt daleko od ich przetwarzania /usposobienie.

Zazwyczaj chcę móc anulować wątek skanowania, co wymaga trochę cierpliwości, ponieważ nie można przerwać wywołań TWAIN, a niektóre z nich są ciężkie. Jak zauważyłeś w swoim Canonie. Z drugiej strony, jeśli wymusisz zabicie wątku w wywołaniu TWAIN, skaner może wymagać cyklu zasilania lub nawet ponownego uruchomienia systemu, a sam TWAIN będzie blokował, dopóki biblioteka DLL menedżera TWAIN nie zostanie załadowana z pamięci i ponownie załadowana. Zwykle najlepiej wyłączać TWAIN bardzo uprzejmie.