当我在C ++代码中使用Cannon EDSDK时,如何让我的相机保持活着?

时间:2018-04-23 03:08:57

标签: c++ edsdk

我认为每隔几分钟就要向相机发送一条消息是必不可少的,所以我初始化我的相机并在我的主线程中每隔一段时间向相机发送消息,而在另一个线程中我打开实时视图来处理我的其他工作,但在实时视图线程中,它在发送此消息时等待时间:

EdsSetPropertyData(theCamera, kEdsPropID_Evf_Mode, 0, sizeof(evfMode), &evfMode)

当我只用一个线程处理所有工作时,我从未见过这个,我不知道为什么会这样发生,有人可以帮我吗?这是我的一些代码。

我的主线程:(我不会在线程中发送keepalive消息,但在启动liveview时也会超时!)

CanonCameraWrapper& wrapper = param->wrapper;
bool setup_ok = wrapper.setup(0);
if (!setup_ok)
{
    wrapper.destroy();
}
wrapper.setDownloadPath("img");
pthread_t camera_thread;
pthread_create(&camera_thread, NULL, camera_thread_func, (void *)(param));
pthread_join(camera_thread, NULL);

另一个帖子

void * camera_thread_func(void * arg)
{
    global_param* param = (global_param*)arg;
    CanonCameraWrapper& wrapper = param->wrapper;
    wrapper.beginLiveView();//**//it wait time out here!!!**
    ...
}

1 个答案:

答案 0 :(得分:0)

我相信你必须要注意两件事。一个是Canon SDK文档中的这个注意事项:

  

创建在Windows下运行的应用程序时,每个线程都需要进行COM初始化   从主线程以外的线程访问摄像机。   要创建用户线程并从该线程访问摄像头,请务必执行CoInitializeEx(NULL,   COINIT_APARTMENTTHREADED)在线程的开头和最后的CoUnInitialize()。   示例代码如下所示。控制EdsVolumeRef或EdsDirectoryItemRef对象时也是如此   来自另一个线程,而不仅仅是EdsCameraRef

另一件事是:您无法同时访问(大部分)SDK。因此,如果您使用多个线程,则必须小心这个