提问者:小点点

如何在C++上启动异步线程


>

  • 我希望使用std::async()
  • 运行不同的OpenCV函数
  • 例如,我正在尝试使用网络摄像机获取和显示图像。
  • 我使用了一个名为CamHandler的类来封装它。
  • 这个示例是故意异步的,我知道我可以在获取图像后显示它:)

    1. 我首先在成员cap:
    2. 中使用open()函数
    auto camHandler::initCamera(int deviceID) -> camHandler::CamState {
        this->deviceID = deviceID;
        this->apiID = cv::CAP_ANY;
        cap.open(deviceID, apiID);
        if (!cap.isOpened()) {
            this->currentState = error;
            return this->currentState;
        }
        return Ready;
    }
    
    auto camHandler::imageStreaming() -> void{
        this->currentState = streaming;
        while(true)
        {
            std::cout << "Acc " << std::endl;
            cap.read(this->frame);
            this->acquired++;
            if (this->frame.empty()) {
                this->currentState = error;
                break;
            }
        };
    }
    

    auto camHandler::displayImage() -> void { 
        while(true){
            std::cout << "Disp " << std::endl;
            cv::imshow("Live", this->frame);
            this->displayed++;
            if (cv::waitKey(5) >= 0){
                this->currentState = paused;
                break;
            }
        };
    }
    
    auto camHandler::startStreaming() -> void { 
        auto stream = std::async(&camHandler::imageStreaming, this);
        auto disp = std::async(&camHandler::displayImage, this);
    }
    

    这个问题

    在我的main中,我只调用:

        camHandler ch;
        ch.initCamera();
        ch.startStreaming();
    

    我得到:

    Acc Disp 
    
    Acc 
    Acc 
    Acc 
    Acc 
    Acc 
    

    这意味着display只被调用一次,而acquisition一直在运行。

    • 如何确保两者都在运行?
    • 像这样,我甚至看不到OpenCV中的图像窗口。
    • 当我进行正常拍摄时,我的相机和显示器正常工作,如OpenCV的站点所示

  • 共1个答案

    匿名用户

    如果尝试使用空的cv::mat调用cv::imshow,它将产生异常,并且async将结束。

    因为它是在异步中运行的,所以可以在cap.read(this->frame)之前调用cv::imshow(“live”,this->frame)

    相关问题


    MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(何在|c++|启动|异步|线程)' ORDER BY qid DESC LIMIT 20
    MySQL Error : Got error 'repetition-operator operand invalid' from regexp
    MySQL Errno : 1139
    Message : Got error 'repetition-operator operand invalid' from regexp
    Need Help?