与 TWAIN 通信的哪些部分可以放入另一个线程,例如 BackgroundWorker?或者:是否可以拆分处理图像传输的循环?
一些扫描仪驱动程序在返回调用应用程序之前扫描所有图像,这会强制应用程序一次处理所有图像。当突然必须立即处理所有事件(在每个扫描图像后引发)时,这会导致例如 OutOfMemoryException 或我的 WPF 应用程序中的奇怪行为。此外,应用程序挂起,直到传输完成。
我正在使用 TwainDotNet: http ://code.google.com/p/twaindotnet/但我也在寻找一个通用的解决方案来描述消息过滤器以及与 TwainDotNet 无关的 TWAIN 的交互。包含 TWAIN 消息的工作流就足够了。也欢迎其他语言,最好是 C 或 Deplhi 之类的语言。
DataSourceManager 中消息过滤器的当前实现可以描述如下:
- 从窗口句柄 (hwnd) 获取消息信息
- 复杂的过滤器,将东西发送到 TWAIN 等。
- 如果消息关闭(例如,当按下 TWAIN UI 中的取消按钮时)
- 关闭数据源
- 禁用过滤器
- 呼叫扫描完成事件
- 如果消息传输准备好:
- 在一个循环中(直到 ADF 为空等,这会阻止消息过滤器)
- 获取图像
- 将图像指针转换为 GDI+ 图像
- 以图像为参数调用 TransferImage 事件
- 重置转移
- 关闭数据源等(同消息关闭)
- 通知窗口,消息已被处理
我已经用几个扫描仪对此进行了测试:
- 每次传输页面时,富士通 fi-5120C 都会调用 TransferImage 事件。该图像会立即在我的 WPF 应用程序的图像列表中弹出。
- 佳能 DR-5010C 会阻止我的 WPF 应用程序,直到扫描完所有图像(直到循环结束)。Windows 甚至说,WPF 应用程序没有响应。传输完所有图像后,仅显示少数图像,图像列表中的选择闪烁等。
我不关心显示问题,而是关心窗口阻塞和内存问题。将传输图像的循环放入 BackgroundWorker 导致了几次崩溃,我无法调试。当然,我考虑了 WPF 的线程问题。我也不知道如何拆分传输循环,以便在传输一张图像后,程序返回消息过滤器并且可以将消息标记为已处理。