QT学习---------知识整理(进阶篇)

一、前言

本文主要讲讲qt的进阶知识,线程、通信、数据库、事件等知识。

二、正文

2.1 QT中的多线程

2.1.1 导言

主线程与子线程注意点:

  •  主线程:默认的线程,程序启动自带的,也叫窗口线程,UI线程负责窗口时间处理或窗口控件数据的更新
  • 子线程:子线程负责后台的业务逻辑处理,子线程中不能对窗口对象做任何操作,窗口的操作需要交给主线程操作
  • 主线程与子线程的关系:主线程与子线程之间如果要进行数据的传递,需要使用Qt中的信号槽机制

2.1.2 线程类QThread

创建子线程的类

2.1.2.1 常用的公共成员函数
  • 构造函数

  • 判断线程中的任务是不是处理完毕了

  • 判断子线程是不是在执行任务

优先级:

  • 得到当前线程的优先级

  • 设置优先级

  • 优先级排序,从低到高:

  • 退出线程,停止底层的事件循环,退出线程的工作函数

  • 调用线程退出函数后,线程不会马上退出,因为当前任务有可能还没有完成,等待任务完成,然后退出线程,一般在exit()后面调用wait()

2.1.2.2 信号槽
  • 和调用exit()效果是一样的,代用quit()后,再调用wait()函数

  • 启动子线程

  • 线程退出,可能是会马上终止线程,一般情况下不使用这个函数

  • 线程中执行的任务完成,发出该信号,任务函数中的处理逻辑执行完毕

  • 开始工作之前发出这个信号,一般不使用

2.1.2.3 静态函数
  • 返回一个指向管理当前执行线程的QThread的指针

  • 返回可以在系统上运行的理想线程数==和当前电脑CPU核心数相同

  • 线程休眠函数

2.1.2.4 任务处理函数
  • 子线程要处理什么任务,需要写到run()中

这个函数是一个受保护的成员函数,不能够在类的外部调用,如果想要让线程执行这个函数中的业务流程,需要通过当前线程对象调用槽函数start()启动子线程,当子线程被启动,这个run()函数也就在线程内部被调用了。

2.1.3 使用方法一

该方法简单,但是都写到run()里面,逻辑容易混乱,不利于维护

2.1.3.1 操作步骤
  • 创建子类,继承QThread

  • 重写父类run()方法,在该函数内部编写子线程要处理的具体业务

  • 在线程中创建子线程对象

  • 启动子线程,调用start()方法

不能在类的外部调用run()方法启动子线程,在外部调用start()相当于让run()开始运行

  • 释放资源

不释放资源会报错。

运行结果:

2.1.4 使用方法二

2.1.4.1 操作步骤
  • 创建一个新的类,让这个类从QObject派生

  • 在这个类中添加一个公共成员函数,函数体就是我们要在子线程中执行的业务逻辑

  • 在主线程中创建一个QThread对象,这就是子线程的对象

  • 在主线程中创建工作的类对象

  • 将MyThread2对象移动到创建的子线程对象中,需要调用QObject类提供的moveToThread()方法

  • 启动线程

  • 调用工作函数

  • 释放资源

  • 运行结果

2.1.5 线程池

2.1.5.1 线程池原理

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务,线程池线程都是后台线程。前面两种多线程的使用方法都要释放线程资源,加入线程池后可以不用释放,线程池会自动释放。

线程池包含三部分:

  • 任务队列,存储需要处理的任务,由工作的线程来处理这些任务
  • .工作的线程
  • 线程池管理器,负责管理线程池的创建、销毁和线程数量的控制
2.1.5.2 QRunnable

  • 在子类中必须要重写的函数,里面是任务的处理流程

  • 参数设置为true,这个任务对象在线程池中的线程处理完毕,这个任务对象就会自动销毁。  参数设置为false,这个任务对象在线程池中的线程处理完毕,对象需要手动销毁

  • 获取当前任务的析构方式,返回true---自动析构,返回false---手动析构

2.1.5.3 QThreadPool

常用的API函数

  • 获取和设置线程中的最大线程个数

  • 给线程池添加任务,任务是一个QRunnable类型的对象,如果线程池中没有空闲的线程了,任务会放到任务队列中,等待线程处理

  • 如果线程池中没有空闲的线程了,直接返回值,任务添加失败,任务不会添加到任务队列中

  • 线程池中被激活的线程个数(正在工作的线程个数)

  • 尝试性的将某一个任务从线程池的任务队列中删除,如果任务已经开始执行就无法删除

  • 在每个Qt应用程序中都有一个全局的线程池对象,通过这个函数直接访问这个对象

2.1.5.4 举例
  • 创建一个要添加到线程池中的任务类

  • 线程池启动与运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值