当前位置: 首页 > 知识库问答 >
问题:

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

邴墨竹
2023-03-14

>

  • 我希望使用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个答案

    薛烈
    2023-03-14

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

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

     类似资料:
    • 我不确定Spring boot异步是如何工作的?我知道webserver有自己的线程池,每个请求都由来自池的线程处理。现在,当我们用spring boot实现异步web服务并配置10个线程时,这是否意味着线程内部有线程?为了澄清,web服务器将向线程分配一个请求。现在当这个线程开始执行并调用一个用@Asynch标记的服务/函数时,它可以创建多个线程来处理请求。请让我知道我的理解是否正确。

    • 我读过Eric lippert关于<code>异步关键字的困惑。他说: 它()意味着“此方法包含包含等待异步操作的控制流,因此将由编译器重写为连续传递样式,以确保异步操作可以在正确的位置恢复此方法。”异步方法的关键在于尽可能多地停留在当前线程上 这个我不懂。如果我执行一个异步方法(< code>Task)并且它运行了,那么它肯定会在另一个线程上运行。 此外,如果我编写一个方法使用,(imho)它会

    • 我遵循了spring批处理文档,无法异步运行我的作业。 因此,我从一个web容器运行该作业,该作业将通过RESTendpoint触发。 我想让JobInstance ID在完成整个作业之前传递它作为响应。因此,他们可以稍后使用JobInstance ID检查作业的状态,而不是等待。但我没能让它工作。下面是我尝试过的示例代码。请让我知道我错过了什么或错了什么。 BatchConfig创建异步JobL

    • 问题内容: 我很难找到一种方法来启动,停止和重新启动Java中的线程。 具体来说,我在中有一个类Task(当前实现)。我的主应用程序需要能够在线程上启动此任务,在需要时停止(杀死)该线程,有时还可以杀死并重新启动该线程… 我的第一次尝试是与,但我似乎找不到办法重新启动任务。当我使用任何将来的呼叫失败时,因为是“关机” … 那么,我该怎么做呢? 问题答案: 一旦线程停止,你将无法重新启动它。但是,没

    • 我知道使用无线程异步有更多线程可用于服务输入(例如HTTP请求),但我不明白当异步操作完成并且需要一个线程来运行它们的延续时,这如何不可能导致线程饥饿。 假设我们只有3个线程 并且它们在需要线程的长时间运行的操作中被阻塞(例如在单独的db服务器上进行数据库查询) 使用async Wait,您可以 然而,在我看来,这可能会导致“正在进行”的异步操作过剩,如果太多的操作同时完成,那么就没有线程可以运行

    • 问题内容: 我试图编写一个文件监视器,它将检查文件是否添加了新行,该监视器实际上是一个线程,它将始终由randomaccessfile读取该行。 这是监视器的核心代码: 这是一些帮助类: 这是调用监视器的示例: 现在,我的问题是,如果我仅调用以下代码,代码就可以很好地工作: 这将监视文件的行追加,并通知侦听器。 但是,当我致电: 这意味着我想监视另一个文件而不是之前。 因此,在Monitor中,我

    • 本文向大家介绍C# 中如何实现线程同步?相关面试题,主要包含被问及C# 中如何实现线程同步?时的应答技巧和注意事项,需要的朋友参考一下 (1)方法一:阻塞(调用Sleep()或Join()) (2)方法二:加互斥锁lock (3)方法三:信号和句柄(AutoResetEvent/ManualResetEvent,调用Set()和WaitOne())    

    • 我已经用自制软件在新的macos10.11服务器上安装了MariaDB。当我手动启动时,服务器运行得很好,但我一直无法让它在引导时自动启动(而不是登录)。我使用在/library/launchdaemons中创建launchd脚本,但它不起作用。没有运行mariadb,没有mariadb错误日志。它似乎默默地失败了。一定有相关的日志,但我不知道在哪里。 当这不起作用时,我尝试创建自己的launch