TWAINとの通信のどの部分を、BackgroundWorkerなどの別のスレッドに入れることができますか?または:画像転送を処理するループを分割することは可能ですか?
一部のスキャナードライバーは、呼び出し元のアプリケーションに戻る前にすべての画像をスキャンします。これにより、アプリケーションはすべての画像を一度に処理します。これにより、たとえば、突然すべてのイベント(スキャンされたすべての画像の後に発生)を一度に処理する必要がある場合に、WPFアプリケーションでOutOfMemoryExceptionまたは奇妙な動作が発生します。さらに、転送が完了するまでアプリケーションがハングします。
私はTwainDotNetを使用しています:http ://code.google.com/p/twaindotnet/しかし、メッセージフィルターとTwainDotNetに依存しないTWAINとの相互作用を説明する一般的なソリューションも探しています。TWAINメッセージを含むワークフローで十分です。他の言語も歓迎されます。CやDeplhiのようなものが望ましいです。
DataSourceManagerでのメッセージフィルターの現在の実装は、次のように説明できます。
- ウィンドウハンドル(hwnd)からメッセージ情報を取得する
- フィルタを複雑にしたり、TWAINなどに送信したりします。
- メッセージが閉じた場合(たとえば、TWAIN UIのキャンセルボタンを押した場合)
- データソースを閉じる
- フィルタを無効にする
- ScanningCompleteイベントを呼び出す
- メッセージ転送の準備ができている場合:
- ループ内(ADFが空になるまでなど、これによりメッセージフィルターがブロックされます)
- 画像を取得
- 画像ポインタをGDI+画像に変換します
- パラメータとして画像を使用してTransferImageイベントを呼び出します
- 転送をリセット
- データソースなどを閉じます(メッセージを閉じるのと同じ)
- メッセージが処理されたことをウィンドウに通知します
私はこれをいくつかのスキャナーでテストしました:
- 富士通fi-5120Cは、ページが転送されるたびにTransferImageイベントを呼び出します。画像は、WPFアプリケーションの画像リストにすぐに表示されます。
- Canon DR-5010Cは、すべての画像がスキャンされるまで(ループが終了するまで)、WPFアプリケーションをブロックします。Windowsは、WPFアプリケーションが応答していないとさえ言っています。すべての画像が転送されると、少数の画像のみが表示され、画像リストでの選択がちらつきます。
表示の問題ではなく、ウィンドウのブロックとメモリの問題について心配しています。画像をBackgroundWorkerに転送するループを配置すると、いくつかのクラッシュが発生し、デバッグできませんでした。原因として、WPFのスレッドの問題を検討しました。また、転送ループを分割する方法もわかりません。そのため、1つの画像を転送した後、プログラムはメッセージフィルタに戻り、メッセージに処理済みのマークを付けることができます。