2010-01-21 2 views
2

Я пишу программу для просмотра файлов, и я хочу, чтобы она корректно работала со всеми портативными устройствами, такими как камеры, смартфоны и т. Д. Моя программа показывает миниатюры, поэтому мне нужно прочитать содержимое каждого файла.Проблема с просмотром устройства

Теперь я столкнулся с некоторыми проблемами:

  1. С обеих моих фотоаппаратами я могу открыть только один ISteam из устройства. Для каждого дополнительного потока я получаю ошибку ERROR_BUSY. Это неудобно, поскольку я получаю миниатюры в нескольких фоновых потоках.

  2. Я могу открыть несколько потоков со своего смартфона, но я не могу искать эти потоки! В качестве обходного пути мне нужно скопировать весь поток во временное расположение файловой системы и обработать его там.

Интересно, от чего это зависит. Файловая система устройства? Внедрение драйвера? Или что-нибудь еще?

ответ

2

Это похоже на очень разумные ограничения на доступ к файлу с периферийным устройством с очень ограниченной памятью (ограниченная быстродействующая память и код EEPROM больше беспокоят, чем размер флеш-карты).

Это не файловая система (которая почти универсальна FAT или FAT32 для этих устройств) или даже ограничения в драйвере Windows (хотя ограничения, вероятно, применяются там, чтобы избежать путаницы с устройством), но ограниченное количество файловых дескрипторов в коде доступа к встроенному файлу устройства.

В результате у вас, вероятно, придется обходные пути для этих и других неподдерживаемых функций драйвера.

В соответствующей заметке несколько потоков обычно не подходят для выполнения операций ввода-вывода в фоновом режиме. Если ваши устройства поддерживают операцию OVERLAPPED, вы можете использовать это вместе с событиями и MsgWaitForMultipleObjects (который заменяет PeekMessage или GetMessage в классическом цикле основных событий GetMessage/TranslateMessage/DispatchMessage). Поддерживая все в одном потоке избежать проблем синхронизации, большинство условий гонки, и предотвратить следующую задачу:

  • Ваш клиент хочет, чтобы выбрать и использовать один из файлов на своем устройстве, но о нет, только IStream используется в нитке, читающей миниатюры. Too Плохо, нужно дождаться, что этот поток до закончит свой текущий файл.