首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何异步地从文档馈线扫描和传输图像?

如何异步地从文档馈线扫描和传输图像?
EN

Stack Overflow用户
提问于 2010-12-15 18:10:43
回答 1查看 2.2K关注 0票数 6

与TWAIN通信的哪些部分可以放到另一个线程中,例如BackgroundWorker?或者:是否有可能分割处理图像传输的循环?

一些扫描仪驱动程序在返回调用应用程序之前扫描所有图像,这迫使应用程序一次处理所有图像。这会导致例如,在我的WPF应用程序中出现OutOfMemoryException或奇怪的行为时,所有事件(在每个扫描图像之后引发)都必须一次处理。此外,应用程序挂起,直到传输完成。

我使用的是TwainDotNet:http://code.google.com/p/twaindotnet/,但我也在寻找一个通用的解决方案,描述消息筛选器和与TwainDotNet无关的TWAIN的交互。包含TWAIN消息的工作流就足够了。其他语言也是受欢迎的,比如C或Deplhi。

DataSourceManager中消息筛选器的当前实现可以描述如下:

从窗口句柄(hwnd)

  • Complicate筛选器获取消息信息,如果消息关闭(例如,当按TWAIN中的cancel按钮时),则将消息发送给TWAIN等。source

  • Disable event

  • 关闭数据过滤器
  • Call ScanningComplete event

如果消息传输就绪:循环中的filter)

  • Get image

  • (直到ADF为空等),这将阻止消息

代码语言:javascript
复制
- ​
    - Convert image pointer to GDI+ image

代码语言:javascript
复制
- ​
    - Call TransferImage event with image as parameter 

代码语言:javascript
复制
- Reset transfer
- Close data source etc. (same as message close)

  • 通知windows,消息已被

处理。

我用几个扫描仪测试过这个:

  • A FujitsuI-5120C每次传输页面时都会调用TransferImage事件。该图像立即弹出在我的WPF application.
  • A佳能DR-5010 C的图像列表中,阻止我的WPF应用程序,直到扫描完所有图像(直到循环结束)。Windows甚至说,WPF应用程序没有响应。在传输完所有图像之后,只显示了很少的图像,并且图像列表中的选择会闪烁等等..

我关心的不是显示问题,而是被阻塞的窗口和内存问题。将图像传输到BackgroundWorker中的循环会导致多个崩溃,这是我无法调试的。当然,我考虑了WPF的线程问题。我也不知道如何分割传输循环,这样,在传输一个图像之后,程序返回到消息过滤器,并且消息可以标记为处理。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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.

  1. 完全处理和处理扫描线程上的每个传入图像,或者
  2. 会阻止来自扫描线程的图像流,这样它就不能在它们的
  3. 之前运行得太远。

我通常发现我希望能够取消扫描线程,这需要一些耐心,因为TWAIN的调用不能中断,而且其中一些是繁重的。你注意到了你的佳能。另一方面,如果强制关闭TWAIN调用中的线程,则扫描器可能需要一个电源周期,甚至需要重新启动系统,直到TWAIN管理器DLL从内存中卸载并重新加载为止。通常最好是非常礼貌地关闭吐温。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4453351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档