与TWAIN通信的哪些部分可以放到另一个线程中,例如BackgroundWorker?或者:是否有可能分割处理图像传输的循环?
一些扫描仪驱动程序在返回调用应用程序之前扫描所有图像,这迫使应用程序一次处理所有图像。这会导致例如,在我的WPF应用程序中出现OutOfMemoryException或奇怪的行为时,所有事件(在每个扫描图像之后引发)都必须一次处理。此外,应用程序挂起,直到传输完成。
我使用的是TwainDotNet:http://code.google.com/p/twaindotnet/,但我也在寻找一个通用的解决方案,描述消息筛选器和与TwainDotNet无关的TWAIN的交互。包含TWAIN消息的工作流就足够了。其他语言也是受欢迎的,比如C或Deplhi。
DataSourceManager中消息筛选器的当前实现可以描述如下:
从窗口句柄(hwnd)
如果消息传输就绪:循环中的filter)
-
- Convert image pointer to GDI+ image
-
- Call TransferImage event with image as parameter
- Reset transfer
- Close data source etc. (same as message close)
处理。
我用几个扫描仪测试过这个:
我关心的不是显示问题,而是被阻塞的窗口和内存问题。将图像传输到BackgroundWorker中的循环会导致多个崩溃,这是我无法调试的。当然,我考虑了WPF的线程问题。我也不知道如何分割传输循环,这样,在传输一个图像之后,程序返回到消息过滤器,并且消息可以标记为处理。
发布于 2013-04-08 14:54:11
我为Atalasoft工作,但我不知道WPF,甚至不了解DotTwain!
我可以告诉你们,一般来说,TWAIN扫描可以在一个单独的扫描线程上进行,但您必须小心。最简单的方法是在扫描线程上执行所有TWAIN操作--不要将TWAIN调用混合在两个线程之间。
扫描线程必须有一个消息泵,或者是一个'UI‘线程,无论在您的环境中采取什么。这不仅仅是一条工作线。
TWAIN希望得到一个窗口句柄(老式的Win32 HWND),作为扫描仪用户界面的父窗口。为此,我建议在扫描线程上创建一个“扫描父”窗口。您可以根据您的选择使其可见或不可见,并在扫描作业结束时销毁它。
如果你的扫描任务很大(例如,50页的400 DPI颜色),你必须确保扫描过程不会填满逻辑内存或RAM。如果您填充逻辑内存(32位Windows进程有大约2GB的地址空间可处理),分配将失败。如果您填充了RAM,正在消耗/处理传入映像的代码可能会开始交换,速度急剧减慢,然后扫描将向前运行,并填充逻辑内存。所以你需要:
processing/disposition.
我通常发现我希望能够取消扫描线程,这需要一些耐心,因为TWAIN的调用不能中断,而且其中一些是繁重的。你注意到了你的佳能。另一方面,如果强制关闭TWAIN调用中的线程,则扫描器可能需要一个电源周期,甚至需要重新启动系统,直到TWAIN管理器DLL从内存中卸载并重新加载为止。通常最好是非常礼貌地关闭吐温。
https://stackoverflow.com/questions/4453351
复制相似问题