Nikon Camera SDK одноразовый - PullRequest
       7

Nikon Camera SDK одноразовый

2 голосов
/ 03 декабря 2010

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

Ответы [ 5 ]

3 голосов
/ 04 декабря 2010

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

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

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

2 голосов
/ 04 декабря 2010

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

1 голос
/ 07 декабря 2010

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

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

0 голосов
/ 04 декабря 2010

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

0 голосов
/ 03 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...