opencv - 后台线程阻止UI线程

时间:2018-04-02 10:13:19

标签: c++ multithreading opencv c++11 background

该程序应该允许用户在图片上绘制几秒钟(如预处理),之后对图片进行一些处理并进行绘制。

我创建后台线程暂停处理一段时间。用户应该能够在那个时间画画。

正在处理while循环。 变量running显示处理是否处于活动状态或用户是否可以绘制。

但是在代码中我编写了后台线程块UI线程,但据我所知,它们并没有交互。

这似乎std::this_thread::sleep_for会阻止所有线程,但文档说它只会阻塞其线程。我不知道这意味着什么。

如何不阻止来自当前线程的所有线程?

更新:这是来自交互式图片细分的MCVE。 程序在后台处理图像并在GUI中显示。 但在处理开始之前,我希望用户能够点击GUI来帮助算法。

当预处理运行时(没有后台,用户可以点击,它将绘制),GUI停止并等待处理开始(直到后台线程结束)。

#include <thread>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>

bool running;
cv::Mat image;

void onMouse(int event, int x, int y, int flags, void*)
{
    running = false;
    if (event == cv::EVENT_LBUTTONDOWN)
    {
        cv::circle(image, cv::Point(x, y), 20, cv::Vec3b(0, 0, 255), CV_FILLED);
        cv::imshow("window", image);
        cv::waitKey(1);
    }
    running = true;
}

int main()
{
    running = false;

    image = cv::Mat(400, 400, CV_8UC3, cv::Scalar(0, 255, 0));
    cv::namedWindow("window", cv::WINDOW_AUTOSIZE);
    cv::imshow("window", image);
    cv::waitKey(1);

    cv::setMouseCallback("window", onMouse);

    std::thread task = std::thread([]()
    {
        std::this_thread::sleep_for(std::chrono::seconds(2));
        running = true;

    });

    while (true)
    {
        if (running)
        {
            cv::imshow("window", image);
            cv::waitKey(1);
        }
    }

    task.join();
    return 0;
}

0 个答案:

没有答案