QT 多线程 QThread

继承QThread的线程

继承 QThread 是创建线程的一个普通方法。其中创建的线程只有 run() 方法在线程里的。其他类内定义的方法都在主线程内。
通过上面的图我们可以看到,主线程内有很多方法在主线程内,但是子线程,只有 run() 方法是在子线程里的 run() 方法是继承于 QThread 类的方法,用户需要重写这个方法,一般是把耗时的操作写在这个 run() 方法里面。
QThread 类继承线程,然后在 MainWindow 类里使用。通过点击一个按钮开启线程。当线程执行完成时,会发送 resultReady(const QString &s) 信号给主线程,代码如下:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QThread>
#include <QDebug>
#include <QPushButton>class WorkerThread;class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:QPushButton *pushButton;WorkerThread *workThread;private slots:void handleResults(const QString &result);void pushButtonClicked();
};class WorkerThread : public QThread
{Q_OBJECTpublic:WorkerThread(QWidget *parent = nullptr){Q_UNUSED(parent);}void run() override {QString result = "Thread Start";/** Timerout*/sleep(2);emit resultReady(result);}signals:void resultReady(const QString &s);
};
#endif // MAINWINDOW_H
#include "mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{this->setGeometry(0,0,800,480);pushButton = new QPushButton(this);workThread = new WorkerThread(this);pushButton->resize(100,40);pushButton->setText("Start Thread");/* 信号槽连接 */connect(workThread, &WorkerThread::resultReady,this, &MainWindow::handleResults);connect(pushButton, &QPushButton::clicked,this, &MainWindow::pushButtonClicked);
}MainWindow::~MainWindow()
{workThread->quit();if(workThread->wait(2000)){qDebug() << "Thread end" << endl;}
}void MainWindow::handleResults(const QString &result)
{qDebug() << result << endl;
}void MainWindow::pushButtonClicked()
{if (!workThread->isRunning())workThread->start();
}

上述代码很简单,相信都能看懂。
主窗口构造函数:当创建 MainWindow 对象时,构造函数设置窗口尺寸,初始化按钮和工作线程,并连接信号槽。
按钮点击事件:当用户点击按钮时,调用 pushButtonClicked 槽函数,启动线程。
线程执行:线程开始运行,暂停2秒,然后发出 resultReady 信号。
结果处理:信号槽机制确保 handleResults 槽函数被调用,输出线程结果。
主窗口析构函数:在销毁 MainWindow 对象时,确保线程被正确终止并释放资源。

效果:

点击开启线程按钮后,延时 2s 后, Qt Creator 的应用程序输出窗口打印出“线程开启成功”。
2s 内多次点击按钮则不会重复开启线程,因为线程在这 2s 内还在运行。同时我们可以看到
点击按钮没卡顿现象。因为这个延时操作是在我们创建的线程里运行的,而 pushButton 是在主
线程里的,通过点击按钮控制子线程的运行。
当关闭程序后,子线程将在主线程的析构函数里退出。注意线程使用 wait() 方法,这里等
2s ,因为我们开启的线和是延时 2s 就完成了。如果是实际的操作,请根据 CPU 的处理能力,
给一个适合的延时,阻塞等待线程完成后,就会自动退出并打印“线程已经结束”。

继承QObject的线程

#include "mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{this->setGeometry(0,0,800,480);pushButton1 = new QPushButton(this);pushButton2 = new QPushButton(this);pushButton1->setGeometry(300, 200, 80, 40);pushButton2->setGeometry(400, 200, 80, 40);pushButton1->setText(" Start Thread ");pushButton2->setText(" failed Thread ");worker = new Worker;worker->moveToThread(&workerThread);/* 线程完成销毁对象 */connect(&workerThread, SIGNAL(finished()),worker, SLOT(deleteLater()));connect(&workerThread, SIGNAL(finished()),&workerThread, SLOT(deleteLater()));/* 发送开始工作的信号,开始工作 */connect(this, SIGNAL(startWork(QString)),worker, SLOT(doWork1(QString)));/* 接收到 worker 发送过来的信号 */connect(worker, SIGNAL(resultReady(QString)),this, SLOT(handleResults(QString)));/* 点击按钮开始线程 */connect(pushButton1, SIGNAL(clicked()),this, SLOT(pushButton1Clicked()));/* 点击按钮打断线程 */connect(pushButton2, SIGNAL(clicked()),this, SLOT(pushButton2Clicked()));
}MainWindow::~MainWindow()
{worker->stopwork();workerThread.quit();if(workerThread.wait(2000)){qDebug() << "Thread end" << endl;}
}void MainWindow::handleResults(const QString &result)
{qDebug() << result << endl;
}void MainWindow::pushButton1Clicked()
{const QString str = "";if (!workerThread.isRunning())workerThread.start();emit this->startWork(str);
}void MainWindow::pushButton2Clicked()
{if(workerThread.isRunning()){worker->stopwork();}
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QThread>
#include <QDebug>
#include <QPushButton>
#include <QMutexLocker>
#include <QMutex>class Worker;class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:QPushButton *pushButton1;QPushButton *pushButton2;QThread workerThread;Worker *worker;private slots:void handleResults(const QString &result);void pushButton1Clicked();void pushButton2Clicked();signals:void startWork(const QString &);
};class Worker : public QThread
{Q_OBJECTprivate:QMutex lock;bool isCanRun;public slots:void doWork1(const QString &parameter){isCanRun = true;while(1){{QMutexLocker locker(&lock);if(!isCanRun){break;}}QThread::sleep(2);emit resultReady(parameter + " dowork1 thread ");}emit resultReady("stop work1 thread");}public:void stopwork(){qDebug() << "thread failed" << endl;QMutexLocker locker(&lock);isCanRun = false;}signals:void resultReady(const QString &result);
};
#endif // MAINWINDOW_H

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/44490.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SvANet:微小医学目标分割网络,增强早期疾病检测

SvANet&#xff1a;微小医学目标分割网络&#xff0c;增强早期疾病检测 提出背景前人工作医学对象分割微小医学对象分割注意力机制 SvANet 结构图SvANet 解法拆解解法逻辑链 论文&#xff1a;SvANet: A Scale-variant Attention-based Network for Small Medical Object Segmen…

【JAVA poi-tl-ext 富文本转word】

富文本转word 环境使用poi-tl-ext的原因富文本转word代码 环境 jdk 1.8 <dependency><groupId>io.github.draco1023</groupId><artifactId>poi-tl-ext</artifactId><version>0.4.16</version> </dependency>poi-tl-ext已经包…

可灵重大升级!新增Web端上线、首尾帧控制、单次生成视频时长增加至10s!

快手视频生成大模型“可灵”&#xff08;Kling&#xff09;&#xff0c;作为全球首个真正用户可用的视频生成大模型&#xff0c;自面世以来&#xff0c;凭借其无与伦比的视频生成效果&#xff0c;在全球范围内赢得了用户的热烈追捧与高度评价。截至目前&#xff0c;申请体验其内…

修正版头像上传组件

修正版头像上传组件 文章说明核心源码展示运行效果展示源码下载 文章说明 在头像剪切上传一文中&#xff0c;我采用div做裁剪效果&#xff0c;感觉会有一些小问题&#xff0c;在昨天基于canvas绘制的功能中改进了一版&#xff0c;让代码变得更简洁&#xff0c;而且通用性相对高…

【WebGIS】从设计层面设计系统

本项目在通过现代信息技术手段&#xff0c;对古村古镇进行多方位、多角度的数字化记录、展示与传播&#xff0c;实现文化遗产的数字化保护、活化利用与共享。项目内容主要包括&#xff1a;1&#xff09;古村古镇数据库的建立&#xff1a;通过多种渠道收集古村古镇的各类信息&am…

如何从 PDF 中删除背景

您是否曾经收到过充满分散注意力背景的扫描 PDF 文档&#xff1f;也许是带有繁忙水印的旧收据或背景光线不均匀的扫描文档。虽然这些背景可能看起来没什么大不了的&#xff0c;但它们会使您的工作空间变得混乱&#xff0c;并使您难以专注于重要信息。轻松删除这些不需要的元素并…

短视频SEO矩阵系统:源码开发与部署全攻略

在数字化时代&#xff0c;短视频已成为人们获取信息、娱乐休闲的重要方式。随着短视频平台的兴起&#xff0c;如何让自己的内容在众多视频中脱颖而出&#xff0c;成为每个创作者和内容运营者关注的焦点。本文将为您深入解析短视频SEO矩阵系统的源码开发与部署&#xff0c;助您在…

MT6825磁编码IC在智能双旋机器人中的应用

MT6825磁编码IC在智能双旋机器人中的应用&#xff0c;无疑为这一领域的创新和发展注入了新的活力。作为一款高性能的磁性位置传感器&#xff0c;MT6825以其独特的优势&#xff0c;在智能双旋机器人的运动控制、定位精度以及系统稳定性等方面发挥了关键作用。 www.abitions.com …

Midjourney v6.5 可能会在“7月底”发布,并改进了真实感和皮肤纹理

Midjourney v6.5即将发布&#xff0c;这一更新将大幅提升图像的真实感和皮肤纹理&#xff0c;为用户带来更逼真的视觉体验。首席执行官David Holz在电话会议中宣布&#xff0c;新版本将提高图像清晰度&#xff0c;特别是在手部和皮肤细节上&#xff0c;同时改进Web应用程序和个…

ABAP调用BAPI时COMMIT WORK AND WAIT未按照预期同步提交问题分析

背景&#xff1a; 在做ABAP开发时&#xff0c;经常会有连续调用BAPI的需求&#xff0c;比如先创建销售订单&#xff0c;再依据销售订单创建交货单&#xff0c;再对交货单进行过账等类似的一连串调用&#xff0c;这种类似的场景往往需要前一步操作的数据完全写入数据库才能进行…

编译打包自己的云手机(redroid)镜像

前言 香橙派上跑云手机可以看之前的文章&#xff1a; 香橙派5plus上跑云手机方案一 redroid(带硬件加速)香橙派5plus上跑云手机方案二 waydroid 还有一个cuttlefish方案没说&#xff0c;后面再研究&#xff0c;cuttlefish的优势在于可以自定义内核且selinux是开启的&#xf…

Aop切面编程(2)--代理模式

1、代理模式的理解&#xff1a;不修改A对象的代码的基础上&#xff0c;对A代码块进行拓展。通过创建ProxyA代理对象&#xff0c;拓展A对象并调用A对象的核心功能&#xff1b; 即&#xff1a;不修改对象的源码基础上&#xff0c;创建代理对象&#xff0c;进行功能的附加和增强&…

端到端拥塞控制的本质

昨天整理了一篇 bbr 的微分方程组建模(参见 bbr 建模)&#xff0c;算是 bbr 算法终极意义上的一个总结&#xff0c;最后也顺带了对 aimd 的描述&#xff0c;算是我最近比较满意的一篇分享了。那么接下来的问题&#xff0c;脱离出具体算法&#xff0c;上升到宏观层面&#xff0c…

uniapp微信小程序 TypeError: $refs[ref].push is not a function

我的写法 this.$refs.addPopup.open();报错 打印出来是这样的 解决 参考未整理 原因 在当前页面使用的v-for循环 并且循环体内也有组件使用了ref&#xff08;而我没有把每个ref做区别命名&#xff09; 这样就导致了我有很多同名的ref&#xff0c;然后就报错了 解决办法&a…

AI人工智能作词,为音乐注入未来之力

在当今的音乐世界中&#xff0c;创新的力量不断推动着边界的拓展&#xff0c;而人工智能作词正以其独特的魅力&#xff0c;成为引领音乐走向未来的强大动力。 “妙笔生词智能写歌词软件&#xff08;veve522&#xff09;”无疑是这股浪潮中的璀璨明星。它利用先进的人工智能技术…

input上传--upload

1.HTML <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>上传文件</title><link rel"…

数据结构——线性表(C语言实现)

写在前面&#xff1a; 在前面C语言的结构体学习中&#xff0c;我提及了链表的操作&#xff0c; 学习数据结构我认为还是需要对C语言的数组、函数、指针、结构体有一定的了解&#xff0c;不然对于结构体的代码可能很难理解&#xff0c;特别是一些书籍上面用的还是伪代码&#xf…

OpenGL笔记一之基础窗体搭建以及事件响应

OpenGL笔记一之基础窗体搭建以及事件响应 总结自bilibili赵新政老师的教程 code review! 文章目录 OpenGL笔记一之基础窗体搭建以及事件响应1.运行2.目录结构3.main.cpp4.CMakeList.txt 1.运行 2.目录结构 01_GLFW_WINDOW/ ├── CMakeLists.txt ├── glad.c ├── main…

Linux基于centos7指令初学3

date指令 作用&#xff1a; date指令可以查看时间 这个指令可以进行格式化 格式&#xff1a;date %想要的内容 Y&#xff1a;年份 m&#xff1a;月份 d&#xff1a;日 H&#xff1a;时 M&#xff1a;分 S&#xff1a;秒 时间分界线可以由…

LabVIEW比例压力控制阀自动测试系统

开发了一套基于LabVIEW编程和PLC控制的比例控制阀自动测试系统。该系统能够实现共轨管稳定的超高压供给&#xff0c;自动完成比例压力控制阀的耐久测试、流量滞环测试及压力-流量测试。该系统操作简便&#xff0c;具有高精度和高可靠性&#xff0c;完全满足企业对自动化测试的需…