Qt项目实例_02_Qt线程间数据通讯及数据共享(线程间共享数据方法:共享内存;信号槽机制;共享类指针 )

文章参考自Qt线程间数据通讯及数据共享,后期会做补充。

1. 背景介绍

在使用QT做项目开发过程中,经常会用到多线程,比如图像采集一个线程,图像处理一个线程、数据通讯一个线程。这些不同的线程中会出现数据共享的需求,Qt线程间共享数据主要有三种方式:

  • 1.使用共享内存;即两个线程都能够共享的变量(全局变量),这样两个线程都能够访问和修改变量,从而达到共享目的;
  • 2.使用信号槽机制,将数据从一个线程传递到另外一个线程
  • 3.共享类指针来进行访问不同类的变量和函数;

目前我用到的就是第二种方法,原笔者推荐使用第三种方法,下篇将会以信号槽的方式实现线程间数据共享以及如何在子线程使用定时器

2. 方法介绍

2.1 共享内存

第一种方法,使用全局变量或全局函数,在其他类或线程中调用,这是各种编程语言中都通用的方法,但全局变量长时间占用内存,影响程序空间使用率,且全局变量修改影响整个程序,程序的安全性无法保证,一般尽量少用全局变量或函数,这种方法不展开介绍了
13-2_Qt 5.9 C++开发指南_线程同步_QMutex+QMutexLocker(目前较为常用)中涉及到了使用公共函数来实现数据共享。

2.2 信号槽进行数据通讯

信号槽功能是QT特有的功能,使用信号槽需要注意以下几个事项:

  • 只有QObject类及其派生的类才能使用信号和槽的机制
  • 在线程间使用信号槽进行通信时,槽参数必须使用元数据类型的参数;
  • 如果使用自定义的数据类型,需要在connect之前将其注册(qRegisterMetaType)为元数据类型;
  • 线程间用信号槽传递参数的话,要加const,因为const文字常量存在常量区中,生命周期和程序一样长。这样可以避免slot调用的时候参数的运行期已过造成引用无效;

这里我用一个balser相机线程采图使用信号槽发到UI线程显示的Demo来展示一下线程间通过信号槽的数据通讯。代码中缺失一部分,后期实际demo时补充。

GrabThread.h:

/*图像采集线程头文件*/
/*GrabThread.h*/
#pragma execution_character_set("utf-8")
#ifndef _GRABTHREAD_H
#define _GRABTHREAD_H
#include <Qtwidgets>
#include <QtCore>
#include <QtGui>
#include <pylon/PylonIncludes.h>
#include <QThread>
#include "opencv2/opencv.hpp"

using namespace Pylon;

class GrabThread : public QThread
{
   
    Q_OBJECT

public:
    GrabThread();
    ~GrabThread();

    void run();
    void init(CInstantCamera &m_camera);
    bool isInit();
    void stop();
    void save(bool);
    void grab(int g =1);
    cv::Mat Result2Mat(CGrabResultPtr &ptrGrabResult);

    CInstantCamera *m_camera;
    CGrabResultPtr ptrGrabResult; //Basler 获取结果指针
    CImageFormatConverter m_formatConverter;//Basler 图片格式转换类
    CPylonImage pylonImage; //Basler 图像格式
    QImage m_image; //Qt图片格式
    QPixmap m_pix;
    String_t m_prefix;

    bool m_stop;
    bool m_init;
    bool m_save;
    
    int m_grab; //获取图像策略 0表示连续获取,1表示获取单帧
    int m_num_one;
    int m_num_continue;
    
signals:
    //发给UI线程的信号
    void ThreadPic(cv::Mat outputPix);

};
#endif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十月旧城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值