VS+Qt多线程开发中传参数的问题

 需求:子线程程序采集图像,窗口线程实时显示图像

平台:VS2017+QT4.5

实现方法:

1创建继承QObject的ImageContinuous类,实现连续采集图像

2主线程内创建ImageContinuous的对象指针,同时创建QThread类的对象指针

3子线程内创建槽函数,实现连续采集功能

4子线程内创建信号,像主线程发送信号,信号带参数cv::Mat型;

5主线程创建信号start,发送start触发子线程的连续采集槽函数;

6连续采集槽函数每采集一张图,向主线程发送一次信号,信号包含图像内容

7主线程接收到子线程信号,更新ui图像显示

子线程类代码,头文件

#pragma once
#include <qobject.h>
#include "MvcCamera.h"
class ImageContinuous :    public QObject
{
    Q_OBJECT
public:
    //explicit ImageContinuous(QObject *parent = 0) : QObject(parent) {}
    ImageContinuous();
    ~ImageContinuous();
public slots:
    void getImage(MvcCamera &m_camera);
signals:
    void imageInfo(cv::Mat temp);
};

子线程类代码,源文件

#include "ImageContinuous.h"
#include "QThread.h"
#include <QDebug>
ImageContinuous::ImageContinuous()
{
}

ImageContinuous::~ImageContinuous()
{
}

void ImageContinuous::getImage(MvcCamera &m_camera)
{
    //QTimer::singleShot();//此函数可用,后期研究

    while (true)
    {
        cv::Mat m_image = m_camera.CaptureOneImage();
        cv::Mat m_imageToShow_1;
        //原始分辨率,2048*1536,缩小512*384
        cv::resize(m_image, m_imageToShow_1, cv::Size(m_image.cols / 4, m_image.rows / 4), 0, 0, CV_INTER_LINEAR);
        emit imageInfo(m_imageToShow_1);
        QThread::msleep(30);
        //qDebug() << "current threadID:" << QThread::currentThread() << endl;
    }
}

 

主线程内部分代码,类的实例定义

private:
    ImageContinuous *m_imageConti;
    QThread *m_realtimeImageThread;

槽函数定义

    void showRealTimeVideo(cv::Mat image);

启动采图的信号定义

void startChildThread(MvcCamera &m_camera);

部分源文件代码,槽信号传递自定义类型参数时必须使用注册的方式,一开始采用信号的连接方式为Qt:DirectionConnect,代码可以编译过去,但是参数传递不过去,并且会导致无法开启子线程!!

//分配内存
    m_imageConti = new ImageContinuous;
    m_realtimeImageThread = new QThread;

    //自定义类型作为槽信号的参数,需要先注册
    qRegisterMetaType<cv::Mat>("cv::Mat");
    qRegisterMetaType<MvcCamera>("MvcCamera&");

    connect(m_realtimeImageThread, &QThread::finished, m_imageConti, &QObject::deleteLater);
    connect(m_realtimeImageThread, &QThread::finished, m_realtimeImageThread, &QObject::deleteLater);


    connect(this, &QtWeldingRobotControlSystem::startChildThread, m_imageConti, &ImageContinuous::getImage);
    connect(m_imageConti, &ImageContinuous::imageInfo, this, &QtWeldingRobotControlSystem::showRealTimeVideo);

    m_imageConti->moveToThread(m_realtimeImageThread);

    //启动子线程
    m_realtimeImageThread->start();

 

posted @ 2021-10-11 14:39  冲2021  阅读(559)  评论(0)    收藏  举报