Nikon SDK позволяет запросить/отклик от ПК до камеры через USB через язык программирования C. При создании двух объектов камеры в двух отдельных потоках невозможно отправить две команды одновременно двум отдельным камерам. Одна камера получит свою команду и отправит ответ, а затем вторая камера получит свою команду и отправит ответ. Я думаю, что это связано с тем, что DLL, к которому обращаются Nikon SDK, использует глобальные переменные. DLL не является открытым исходным кодом, поэтому я не могу изменить или проверить это. Я сделал две отдельные копии DLL, и каждый поток имеет отдельную копию. Можно ли отправить две команды и получить ответы назад одновременно?Nikon Camera SDK non-reentrant
ответ
Несмотря на то, что вы сделали две копии DLL, они оба загружаются в одно и то же адресное пространство/процесс, поэтому любые конфликты все равно будут перекрываться.
Первое, что я попробую, это два отдельных EXE, каждый из которых загружает оригинальную DLL, так что они работают в разных процессах. Если это позволяет управлять двумя камерами независимо и одновременно, вам просто нужно создать какую-то систему изоляции процесса :-)
Единственный способ, которым я знаю это сделать (и это непросто), - это построить COM обложки вокруг DLL Nikon и использовать IIS, чтобы изолировать два экземпляра в своих собственных процессах. Немного более простой подход может заключаться в том, чтобы создать собственный «сервер» для каждой камеры, работать в EXE-процессе и отправлять ему сообщения (возможно, только сообщения Windows) из третьего мастер-процесса.
Сначала подумайте, что я попытаюсь создать 2 экземпляра вашего приложения. Один для каждой камеры.
Решение для грубой силы должно запускать каждый процесс на своей виртуальной машине с использованием рабочей станции VMWare или аналогичной архитектуры виртуального ПК. Конечно, теперь у вас возникла проблема связи между двумя виртуальными ПК ...
Не уверен, что именно вы пытаетесь выполнить. Получается ли ответ слишком долго, так что вы хотите получить ответы одновременно? Почему бы просто не просто создать оболочку и убедиться, что вопрос/ответ просто синхронный, так что вы можете получить доступ к SDK из любого потока (и в случае, если поток X ждет ответа, а поток Y делает запрос, поток Y будет ждать пока поток X не получит ответ, а затем сделает запрос).
Эти файлы md3 не являются потокобезопасными и содержат статические функции. Я работал над Nikon SDK, динамически создавая новую копию файла md3 каждый раз, когда камера подключена. У меня был один основной md3 для обнаружения камер, а затем каждый раз, когда я подключался, создавал новый md3.
Наконец, убедитесь, что ваш класс является потокобезопасным и не содержит глобальных или статических функций. Я рекомендую включить базовый код Nikon в класс. Если для написания сторонней библиотеки DLL, требующей статических функций, используйте указатель на класс Nikon, для каждого статического вызова передайте объект void *, созданный вашим конструктором.
Имеет ли две отдельные копии DLL-работы? – MerickOWA 2010-12-03 20:12:42
Как вы получаете два потока для использования разных копий DLL, если они являются частью одного и того же процесса? Процессор-загрузчик исправляет доступ к DLL и указывает их в одну DLL задолго до запуска. – 2010-12-03 20:34:03
@Mark: сделав вторую физическую копию DLL с другим именем. – 2010-12-03 20:35:54