首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >佳能EDSDK C++中的MultiThreading

佳能EDSDK C++中的MultiThreading
EN

Stack Overflow用户
提问于 2016-10-27 19:05:21
回答 1查看 819关注 0票数 0

我尝试在c++.but的edsdk开发中添加多个头,当在"takePictures()“中执行"takeSinglePicture()”时,代码被卡住了,相机甚至不能使用单个picture.how来修复this.the代码。

代码语言:javascript
复制
void CameraControl::takePictures(int n,int time) {
    openSession();
    CTimer timer;
    for (int i = 0; i < n; i++) {
        timer.start();
        std::cout<<std::this_thread::get_id()<<endl;
        takeSinglePicture();
        int t = timer.stop();
        if (t < time)  std::this_thread::sleep_for(std::chrono::milliseconds(time-t));
        std::cout << t << std::endl;
    }
   closeSession();

}


void CameraControl::takePicturesMT(int n,int time) {
    std::cout << std::this_thread::get_id() << endl;
    std::thread cameraThread([&] {CameraControl::takePictures(n,time); });
    cameraThread.join();
}

void CameraControl::takeSinglePicture() {
    EdsSendCommand(theCamera, kEdsCameraCommand_PressShutterButton, 1); // Half
    EdsSendCommand(theCamera, kEdsCameraCommand_PressShutterButton, 3); // Completely
    EdsSendCommand(theCamera, kEdsCameraCommand_PressShutterButton, 0); // Off

}
EN

回答 1

Stack Overflow用户

发布于 2016-10-28 05:35:23

一般来说,Canon SDK不是线程安全的,在不同的线程上调用SDK函数之前,您需要在Windows上调用CoInitializeEx (并确保没有同时执行其他命令)。

佳能SDK使用初始化线程作为主线程,并在那里执行所有命令。这意味着您尝试调用takeSinglePicture命令,该命令尝试在主线程上执行该命令,并且主线程等待takePictures线程完成->死锁。

这个问题的解决方案是要么不等待线程完成(没有cameraThread.join),要么在不同的线程上初始化SDK。第二种解决方案要困难得多,因为您需要实现自己的消息泵(使用EdsGetEvent函数),并且在调用SDK函数时要小心。它也不能在macOS上工作,因为SDK的主线程总是应用程序的主线程(无论你从哪里初始化)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40283019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档