c++ - 设备浏览问题

标签 c++ windows winapi device shell32

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

现在我面临一些问题:

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

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

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

最佳答案

这些似乎是对内存非常有限的外围设备的文件访问的非常合理的限制(有限的快速 volatile 内存和代码 EEPROM 比闪存卡的大小更令人担忧)。

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

因此,对于这些和其他不受支持的驱动程序功能,您可能必须有变通办法。

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

  • 您的客户想要选择和使用 她设备上的其中一个文件,但是 哦不,正在使用唯一的 IStream 在阅读缩略图的线程上。也 不好,必须等待那个线程 完成其当前文件。

关于c++ - 设备浏览问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2109454/

相关文章:

performance - IO 其他操作性能计数器说明

C++ 日期中的秒数

c++ - 如何在 C++ 任务管理器上更改进程的名称?

使用安装项目安装时未显示 Windows 服务

python - Windows 7 : how to bring a window to the front no matter what other window has focus?

c++ - 从其他线程关闭对话框后无法从主窗口聚焦

c++ - 加速 3 维数组上的许多访问

C++ - 转换空指针

c++ - 为嵌套枚举类声明友元插入运算符(运算符<<)

C# FontFamily 不显示新字体