2010-12-03 2 views
2

Nikon SDK позволяет запросить/отклик от ПК до камеры через USB через язык программирования C. При создании двух объектов камеры в двух отдельных потоках невозможно отправить две команды одновременно двум отдельным камерам. Одна камера получит свою команду и отправит ответ, а затем вторая камера получит свою команду и отправит ответ. Я думаю, что это связано с тем, что DLL, к которому обращаются Nikon SDK, использует глобальные переменные. DLL не является открытым исходным кодом, поэтому я не могу изменить или проверить это. Я сделал две отдельные копии DLL, и каждый поток имеет отдельную копию. Можно ли отправить две команды и получить ответы назад одновременно?Nikon Camera SDK non-reentrant

+2

Имеет ли две отдельные копии DLL-работы? – MerickOWA 2010-12-03 20:12:42

+0

Как вы получаете два потока для использования разных копий DLL, если они являются частью одного и того же процесса? Процессор-загрузчик исправляет доступ к DLL и указывает их в одну DLL задолго до запуска. – 2010-12-03 20:34:03

+0

@Mark: сделав вторую физическую копию DLL с другим именем. – 2010-12-03 20:35:54

ответ

2

Несмотря на то, что вы сделали две копии DLL, они оба загружаются в одно и то же адресное пространство/процесс, поэтому любые конфликты все равно будут перекрываться.

Первое, что я попробую, это два отдельных EXE, каждый из которых загружает оригинальную DLL, так что они работают в разных процессах. Если это позволяет управлять двумя камерами независимо и одновременно, вам просто нужно создать какую-то систему изоляции процесса :-)

Единственный способ, которым я знаю это сделать (и это непросто), - это построить COM обложки вокруг DLL Nikon и использовать IIS, чтобы изолировать два экземпляра в своих собственных процессах. Немного более простой подход может заключаться в том, чтобы создать собственный «сервер» для каждой камеры, работать в EXE-процессе и отправлять ему сообщения (возможно, только сообщения Windows) из третьего мастер-процесса.

0

Сначала подумайте, что я попытаюсь создать 2 экземпляра вашего приложения. Один для каждой камеры.

2

Решение для грубой силы должно запускать каждый процесс на своей виртуальной машине с использованием рабочей станции VMWare или аналогичной архитектуры виртуального ПК. Конечно, теперь у вас возникла проблема связи между двумя виртуальными ПК ...

0

Не уверен, что именно вы пытаетесь выполнить. Получается ли ответ слишком долго, так что вы хотите получить ответы одновременно? Почему бы просто не просто создать оболочку и убедиться, что вопрос/ответ просто синхронный, так что вы можете получить доступ к SDK из любого потока (и в случае, если поток X ждет ответа, а поток Y делает запрос, поток Y будет ждать пока поток X не получит ответ, а затем сделает запрос).

1

Эти файлы md3 не являются потокобезопасными и содержат статические функции. Я работал над Nikon SDK, динамически создавая новую копию файла md3 каждый раз, когда камера подключена. У меня был один основной md3 для обнаружения камер, а затем каждый раз, когда я подключался, создавал новый md3.

Наконец, убедитесь, что ваш класс является потокобезопасным и не содержит глобальных или статических функций. Я рекомендую включить базовый код Nikon в класс. Если для написания сторонней библиотеки DLL, требующей статических функций, используйте указатель на класс Nikon, для каждого статического вызова передайте объект void *, созданный вашим конструктором.