2

我正在编写文件浏览软件,我希望它能够在所有便携式设备上正常工作,例如相机、智能手机等。我的程序显示缩略图,所以我需要阅读每个文件的内容。

现在我面临一些问题:

  1. 使用我的两个相机,我只能从设备打开一个 ISteam。对于每个额外的流,我都会收到 ERROR_BUSY 错误。这很不方便,因为我在几个后台线程中获得了缩略图。

  2. 我可以从我的智能手机打开多个流,但我无法寻找那些流!作为解决方法,我必须将整个流复制到临时文件系统位置并在那里处理它。

我想知道这取决于什么。设备文件系统?驱动实现?还是别的什么?

4

1 回答 1

2

这些似乎是对内存非常有限的外围设备的文件访问的非常合理的限制(有限的快速易失性内存和代码 EEPROM 比闪存卡的大小更受关注)。

这不是文件系统(对于这些类型的设备几乎普遍是 FAT 或 FAT32),甚至不是 Windows 驱动程序中的限制(尽管可能在那里强制执行这些限制以避免混淆设备),而是设备嵌入的文件描述符数量有限文件访问代码。

因此,您可能必须为这些和其他不受支持的驱动程序功能提供解决方法。

在相关说明中,多线程通常不是执行后台 I/O 操作的正确方法。如果您的设备支持 OVERLAPPED 操作,那么您可以将其与事件和 MsgWaitForMultipleObjects 一起使用(在经典的 GetMessage/TranslateMessage/DispatchMessage 主事件循环中替换 PeekMessage 或 GetMessage)。通过将所有内容保持在一个线程上,您可以避免同步问题、大多数竞争条件,并防止以下问题:

  • 您的客户想要在她的设备上选择并使用其中一个文件,但是哦,不,唯一的 IStream 正在用于读取缩略图的线程上。太糟糕了,必须等待该线程完成其当前文件。
于 2010-02-06T18:07:11.667 回答