mat*_*zek 6 .net twain hwnd backgroundworker
与TWAIN通信的哪些部分可以放入另一个线程,例如BackgroundWorker?或者:是否可以拆分处理图像传输的循环?
某些扫描仪驱动程序会在返回调用应用程序之前扫描所有图像,这会强制应用程序立即处理所有图像.这导致例如OutOfMemoryException或我的WPF应用程序中的奇怪行为,当突然所有事件(在每个扫描图像之后引发)必须立即处理.此外,应用程序会挂起,直到传输完成.
我正在使用TwainDotNet:http://code.google.com/p/twaindotnet/但我也在寻找一个通用的解决方案,描述消息过滤器以及与TWAIN独立的TwainDotNet的交互.包含TWAIN消息的工作流程就足够了.其他语言也很受欢迎,比较喜欢C或Deplhi.
DataSourceManager中消息过滤器的当前实现可以描述如下:
我用几台扫描仪测试了这个:
我不关心显示问题,而是关注被阻止的窗口和内存问题.将将图像传输到BackgroundWorker的循环导致几次崩溃,我无法调试.因为我考虑了WPF的线程问题.我也不知道如何拆分传输循环,这样,在传输一个图像后,程序返回到消息过滤器,消息可以标记为已处理.
我在Atalasoft工作,但我不知道WPF,甚至不知道DotTwain!
我可以告诉你,通常TWAIN扫描可以在一个单独的扫描线程上完成,但你必须要小心.最简单的方法是在扫描线程上执行所有TWAIN操作 - 不要在两个线程之间混合TWAIN调用.
扫描线程必须有一个消息泵或一个'UI'线程,无论您的环境如何.它不仅仅是一个工人线程.
TWAIN希望获得一个窗口句柄(老式的Win32 HWND),用作扫描仪UI的父窗口.我建议在扫描线程上为此目的创建一个"扫描父级"窗口.您可以根据需要将其设置为可见,并在扫描作业结束时将其销毁.
如果扫描作业非常大(例如50页400 DPI颜色),则必须确保扫描过程不会填满逻辑内存或RAM.如果填满逻辑内存(32位Windows进程可以获得大约2GB的地址空间)分配将失败.如果填满RAM,消耗/处理传入图像的代码可能会开始交换,从根本上减慢速度,然后扫描向前运行并填满逻辑内存.所以你需要:
我经常发现我希望能够取消扫描线程,这需要一些耐心,因为TWAIN调用不能被中断,其中一些很重.正如你已经注意到你的佳能.另一方面,如果强制终止TWAIN调用中的线程,扫描程序可能需要重启或甚至系统重启,TWAIN本身将阻塞,直到TWAIN管理器DLL从内存中卸载并重新加载.通常最好礼貌地关闭TWAIN.
| 归档时间: |
|
| 查看次数: |
1867 次 |
| 最近记录: |