博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
QT学习之如何使用QThread(继承QThread)
阅读量:3782 次
发布时间:2019-05-22

本文共 1798 字,大约阅读时间需要 5 分钟。

概述

​ 通常在程序中需要同时做好几件事情,这时不可避免的会涉及到多线程的学习,QT学习过程中亦是如此,而QT中提供了 QThread,因为涉及到信号与槽,线程的使用也有些变化。在QThread的文档中有两种使用方法。

文章目录

一. 继承 QThread

在第二种方式中,直接继承QThread 类,并且重新实现 run 函数,且只有run 函数就运行在新的线程中。所以常见的做法如下:

  • 继承 QThread 类;

  • 重新实现 run 函数,要在其中实现无限循环或者事件循环,线程才不会退出;

  • 代码片段如下:

    //Consumer 继承于 QThreadConsumer consumer; consumer.start(); //就是运行 run函数

注意:

  • 只有运行在 run 函数的代码,才在新的线程中

  • 如果别的线程和 run 函数中,同时操作线程对象(如 consumer)的成员变量,这个时候就要做线程同步,为其做加锁等操作!

二. 使用继承 QThread 类的例子

下面用一个简单的生产者-消费者例子来说明它的使用:

  1. 先创建一个生产者,简单的加一个生产完成信号
#ifndef PRODUCER_H#define PRODUCER_H#include 
class Producer : public QObject{
Q_OBJECTpublic: explicit Producer(QObject *parent = nullptr);signals: void produce(QString fruit); //生产水果完成信号public slots:};#endif // PRODUCER_H
  1. 再创建一个消费者线程,继承 QThread 类, 在线程中实现消费
  • 在头文件中,声明 run 函数 以及接受来自生产者的槽函数
#ifndef CONSUMER_H#define CONSUMER_H#include 
#include
class Consumer : public QThread{
Q_OBJECTpublic: Consumer();private: void run() override; //重新实现run() QQueue
fruits; //用于接收生产者生产的水果public slots: void get(const QString fruit); //接收水果的槽函数};#endif // CONSUMER_H
  • 在源文件中,主要是在在 run 函数中,一直读取来自生产者发送来的数据
#include "consumer.h"#include 
Consumer::Consumer(){
}void Consumer::get(const QString fruit){
qDebug()<<"当前get()所在线程ID:"<
<
0) {
qDebug()<<"当前run()所在线程ID:"<
<
  1. 在主函数中实现
#include 
#include
#include "producer.h"#include "consumer.h"int main(int argc, char *argv[]){
QCoreApplication a(argc, argv); qDebug()<<"当前consumer所在线程ID:"<
<
  • 结果
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P8ycmNX1-1616430866671)(./image/QThread线程结果.png)]

从上面可以看出:

  • 该继承于 QThread 类的对象,只有run()运行在新的线程中,其他函数是在主线程中运行,因此这个时候如果对象的成员变量,同时在两个线程中被操作时,就要考虑线程同步的问题了
  • 就算是用信号发送的方式,Qthread对象 的槽函数也是运行于旧的线程

项目代码已上传,欢迎下载!

后续也将分享QT的学习,欢迎点赞,关注,赞赏我!

转载地址:http://mumvn.baihongyu.com/

你可能感兴趣的文章
路由器的搭建虚拟机上网及DHCP服务、dns解析
查看>>
linux系统的定时、延迟任务管理
查看>>
linux系统的磁盘管理方式
查看>>
管理lvm(Logical Volume Manager)
查看>>
yum源的配置及第三方软件仓库的管理、yum命令、rpm命令的使用
查看>>
linux系统的selinux管理
查看>>
linux系统的网络桥接配置及链路聚合
查看>>
关于DNS部署
查看>>
类的内存模型(二)
查看>>
生产者消费者模型
查看>>
#剑指offer Day2 一类可以用“框架”快速搞定的二叉树问题
查看>>
#剑指offer Day3 一类 “ 斐波那契 ”问题
查看>>
#剑指offer Day4 一类 “ 双指针 ”问题
查看>>
#剑指offer Day5 # 分享两个题的其他解法
查看>>
缓存淘汰算法的实现与应用介绍(LRU,LFU)
查看>>
JZ15. 反转链表
查看>>
1. 两数之和
查看>>
2. 两数相加
查看>>
JZ1.二维数组的查找
查看>>
String 类
查看>>