Проблема с просмотром устройства - PullRequest
2 голосов
/ 21 января 2010

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

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

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

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

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

1 Ответ

2 голосов
/ 06 февраля 2010

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

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

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

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

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