当前位置: 首页 > news >正文

Qt:线程

一个Qt窗口生成后,为什么拖动窗口,窗口可以随着鼠标移动或放大缩小
因为对窗口操作后,都有对应的事件产生,Qt在其框架中对这些事件进行了默认处理
一个Qt程序默认只有一个线程,称为主线程(也叫ui线程),主要处理窗口的事件(比如鼠标拖动,缩放,窗口控件对象数据的更新)
不能用子线程处理这些事,如果子线程要操作窗口,只能先将数据传递给主线程,由主线程操作

常用函数

分为三个部分,公有函数、公有槽函数,信号,Qt提供的静态成员函数
父对象和父类是两回事,父类是继承关系,父对象是从属关系

// 构造函数
QThread::QThread(QObject *parent = Q_NULLPTR);
指定一个父对象就可以了// 判断线程中的任务是不是处理完毕了
bool QThread::isFinished() const;
// 判断子线程是不是在执行任务
bool QThread::isRunning() const;// Qt中的线程可以设置优先级
// 得到当前线程的优先级
Priority QThread::priority() const;
void QThread::setPriority(Priority priority);
优先级:QThread::IdlePriority         --> 最低的优先级QThread::LowestPriorityQThread::LowPriorityQThread::NormalPriorityQThread::HighPriorityQThread::HighestPriorityQThread::TimeCriticalPriority --> 最高的优先级QThread::InheritPriority      --> 子线程和其父线程的优先级相同, 默认是这个
// 退出线程, 停止底层的事件循环
// 退出线程的工作函数
void QThread::exit(int returnCode = 0);
// 调用线程退出函数之后, 线程不会马上退出因为当前任务有可能还没有完成, 调回用这个函数是
// 调用wait后会等待任务执行, 执行完退出线程, 一般情况下会在 exit() 后边调用这个函数
bool QThread::wait(unsigned long time = ULONG_MAX);

// 和调用 exit() 效果是一样的
// 调用这个函数之后, 再调用 wait() 函数
[slot] void QThread::quit();// 启动子线程
[slot] void QThread::start(Priority priority = InheritPriority);// 线程退出, 可能是会马上终止线程, 一般情况下不使用这个函数
[slot] void QThread::terminate();

信号

// 线程中完成后, 会发出该信号
[signal] void QThread::finished();// 发出该信号后表示线程开始工作,启动线程后没必要捕捉该信号
[signal] void QThread::started();

主线程和子线程间通过信号和槽进行数据传递

静态函数

// 返回一个指向管理当前执行线程的QThread的指针
[static] QThread *QThread::currentThread();// 返回可以在系统上运行的理想线程数 == 和当前电脑的 CPU 核心数相同
[static] int QThread::idealThreadCount();// 线程休眠函数
[static] void QThread::msleep(unsigned long msecs);	// 单位: 毫秒
[static] void QThread::sleep(unsigned long secs);	// 单位: 秒
[static] void QThread::usleep(unsigned long usecs);	// 单位: 微秒

任务处理函数

// 子线程要处理什么任务, 需要写到 run() 中
[virtual protected] void QThread::run();

该函数没有参数和返回值,是一个受保护的虚函数,如果让子线程处理某些任务,需要将任务写到run内部,调用start函数就能执行线程内部的run函数

受保护说明该函数不能在类外使用,需要通过调用start槽函数使run函数运行执行任务

使用方式

方式1:

  • 创建线程类,该类继承QThread类
  • 在线程的子类中重写run函数
  • 在主线程类中new一个子线程的类对象,让该子线程对象调用start函数

子类头文件

#include <QThread>
class MyThread : public QThread
{Q_OBJECT
public:explicit MyThread(QObject *parent = nullptr);protected:void run();signals:// 自定义信号, 传递数据void curNumber(int num);public slots:
};

子类源文件

#include "mythread.h"
#include <QDebug>
MyThread::MyThread(QObject *parent) : QThread(parent)
{}void MyThread::run()
{qDebug() << "当前线程对象的地址: " << QThread::currentThread();int num = 0;while(1){emit curNumber(num++);if(num == 10000000){break;}QThread::usleep(1);}qDebug() << "run() 执行完毕, 子线程退出...";
}
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "mythread.h"
#include <QDebug>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);qDebug() << "主线程对象地址:  " << QThread::currentThread();// 创建子线程MyThread* subThread = new MyThread;connect(subThread, &MyThread::curNumber, this, [=](int num){ui->label->setNum(num);});connect(ui->startBtn, &QPushButton::clicked, this, [=](){// 启动子线程subThread->start();});
}MainWindow::~MainWindow()
{delete ui;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • LeetCode 热题100-2
  • Unity引擎加密方案解析
  • Linux装ifort环境
  • el-select选项框样式修改
  • 【cv::triangulatePoints】其中的投射矩阵P(3x4)是怎么得到的?(内外参数K[R|t]到最终矩阵的变换过程)
  • 【ESP32】在原理图中为什么要在VCC处加几个电容
  • 写给非机器学习人员的 embedding 入门
  • 【FreeRTOS】队列实验多设备玩游戏(思路)
  • C++学习笔记----2、使用C++进行优雅编程(七)----使用常数
  • 【模电笔记】——反馈放大电路
  • 如何妙用哈希表来优化遍历查找过程?刷题感悟总结,c++实现
  • shuishuishui
  • ubuntu24.04lts cmake编译 opencv4.5.4 contrib的一些问题
  • .NET+WPF 桌面快速启动工具 GeekDesk
  • Python 设计模式之享元模式
  • CSS实用技巧
  • DataBase in Android
  • MySQL几个简单SQL的优化
  • Quartz初级教程
  • spring boot 整合mybatis 无法输出sql的问题
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 给Prometheus造假数据的方法
  • 聊一聊前端的监控
  • 前端工程化(Gulp、Webpack)-webpack
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 王永庆:技术创新改变教育未来
  • 源码安装memcached和php memcache扩展
  • FaaS 的简单实践
  • Spring第一个helloWorld
  • 大数据全解:定义、价值及挑战
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (二)c52学习之旅-简单了解单片机
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (含笔试题)深度解析数据在内存中的存储
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (转)iOS字体
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .Net Core 笔试1
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .net下的富文本编辑器FCKeditor的配置方法
  • .net专家(高海东的专栏)
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • @test注解_Spring 自定义注解你了解过吗?
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • @软考考生,这份软考高分攻略你须知道
  • [\u4e00-\u9fa5] //匹配中文字符