尼康SDK允许通过USB编程语言从PC到相机的请求/响应系统。在两个单独的线程中创建两个摄像机对象时,无法同时向两个单独的摄像机发送两个命令。一台摄像机将获得其命令,并发回响应,然后第二台摄像机将获得其命令并发回响应。我认为这与尼康SDK访问的DLL使用全局变量的事实有关。 DLL不是开源的,所以我无法更改或验证这一点。我确实制作了两个单独的DLL副本,每个线程都有一个单独的副本。是否可以发送两个命令并同时获得响应?
答案 0 :(得分:3)
即使您制作了两个DLL副本,它们也被加载到相同的地址空间/进程中,因此任何冲突仍然会重叠。
我要尝试的第一件事是两个单独的EXE,每个都加载原始DLL,以便它们在不同的进程中运行。如果这允许独立并同时控制两个摄像机,您只需构建某种过程隔离系统: - )
我知道这样做的唯一方法(并不容易)是围绕Nikon DLL构建一个COM包装器,并使用IIS将两个实例隔离到它们自己的进程中。一种稍微简单的方法可能是为每个摄像机构建自己的“服务器”,在EXE过程中运行,并从第三个主进程向它发送消息(可能只是Windows消息)。
答案 1 :(得分:2)
强力解决方案是使用VMWare Workstation或类似的虚拟PC架构在自己的虚拟机中运行每个进程。当然,现在你遇到了两个虚拟PC之间的通信问题......
答案 2 :(得分:1)
这些md3文件不是线程安全的并且包含静态函数。每次连接相机时,我都会通过动态创建md3文件的新副本来使用Nikon SDK。我有一个用于检测相机的主md3,然后每次连接时都会创建一个新的md3。
最后,确保您的类是线程安全的,并且不包含全局或静态函数。我建议将基本尼康代码封装到一个类中。如果您编写需要静态函数的第三方dll使用指向Nikon类的指针,则每次静态调用都会传递构造函数创建的void *对象。
答案 3 :(得分:0)
首先想我会尝试生成2个应用程序实例。每个相机一个。
答案 4 :(得分:0)
不确定你要完成的是什么。答案是否需要太长时间,以便您希望同时获得答案?为什么不简单地创建一个包装器并确保问题/答案只是同步,这样你就可以从任何线程访问SDK(如果线程X正在等待响应并且线程Y发出请求,则线程Y将等待直到线程X得到响应,然后发出请求。)