主函数跳过线程而不加入以显示所需的输出

Posted

技术标签:

【中文标题】主函数跳过线程而不加入以显示所需的输出【英文标题】:Main function skipping thread and not joining to show the desired output 【发布时间】:2017-06-19 15:09:43 【问题描述】:

函数 ProcessFrames 获取图像的一个象限,并对其应用 Canny 过滤器。但是创建的线程不会给出 Canny 检测到的图像。相反,我在 imshow() 中获得了图像的颜色象限。

void ProcessFrames(Mat &image)

    Mat test = image;
    Canny(test, image, 5, 60, 3);


void main()

    Mat frame;
    Mat top_left, top_right, bot_left, bot_right;
    String filename = "C:\\Users\\operator\\Downloads\\MODFAM1080I.mpg";
    VideoCapture capture(filename);
    if (!capture.isOpened())
        throw "Error when reading video file!!";
    while (1)
    
        capture >> frame;
        if (frame.empty())
        break;
        top_left = frame(Range(0, frame.rows / 2 - 1), Range(0, frame.cols / 2 - 1));
        top_right = frame(Range(0, frame.rows / 2 - 1), Range(frame.cols / 2, frame.cols - 1));
        bot_left = frame(Range(frame.rows / 2, frame.rows - 1), Range(0, frame.cols / 2 - 1));
        bot_right = frame(Range(frame.rows / 2, frame.rows - 1), Range(frame.cols / 2, frame.cols - 1));
        //Cropping the image into four quadrants to process it separately. 
        thread t1(ProcessFrames,top_left); //invoking a thread and passing first quadrant.
        t1.join(); //joing the thread with the main function
        imshow("Canny", top_left); // still shows color image of the first quadrant. Canny not reflected.
        cvWaitKey(10);
    

【问题讨论】:

如果你只是想异步运行函数,你应该阅读std::async。 如果你之后立即加入,你为什么要创建一个线程? 你在使用 MSVS 吗? 重复? ***.com/questions/21048906/… std::thread 按值获取参数,即使函数通过引用获取参数。 @FrançoisAndrieux 它不重视他们。不幸的是,它所做的是将它们复制到线程的状态中。 【参考方案1】:

std::thread 构造函数复制所有内容。 如果你想传递数据指针并且这个数据在线程中被改变,你必须用std::ref()包装它。

【讨论】:

以上是关于主函数跳过线程而不加入以显示所需的输出的主要内容,如果未能解决你的问题,请参考以下文章

将表作为参数传递给函数

C# 的未来:主构造函数

GoogleWebRTC 在 swift 本机应用程序 (OpenVidu) 中挂起(冻结)主线程

esp32多个例程如何组合

如何使主活动线程影响第二个活动

编写自定义函数:建立双向链表,该链表有20个结点,20个结点所需的数值由随机函数产生。 编写自定义函数: