【问题标题】:How to keep my camera alive when I use Cannon EDSDK in my C++ code?当我在 C++ 代码中使用 Cannon EDSDK 时,如何让我的相机保持活力?
【发布时间】:2018-04-23 03:08:57
【问题描述】:

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

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!!!**
    ...
}

【问题讨论】:

    标签: c++ edsdk


    【解决方案1】:

    我认为您必须注意两件事。一个是佳能 SDK 文档中的通知:

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

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

    【讨论】:

    • 非常感谢,你的回答很专业!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    相关资源
    最近更新 更多