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

QT+多线程编程

QT的多线程编程有两种

1、自定义类继承QThread

第一种是自定义一个类继承于QThread,重写run()方法来实现。然后当需要使用线程的时候你就新建一个自定义对象,然后调用start方法开始运行。

下面的例子是widget里面创建一个线程,然后调用start开始运行,线程运行run方法发送信号,widget接收到信号打印。

#include "mythread.h"myThread::myThread(QThread *parent): QThread{parent}
{}void myThread::run()
{emit showSignal();
}
#ifndef MYTHREAD_H
#define MYTHREAD_H#include <QThread>class myThread : public QThread
{Q_OBJECT
public:explicit myThread(QThread *parent = nullptr);void run() override;signals:void showSignal();};#endif // MYTHREAD_H
#include "widget.h"
#include "ui_widget.h"
#include "mythread.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);myThread *thread=new myThread();connect(thread,&myThread::showSignal,[=](){qDebug() << "mythread is running";});thread->start();
}Widget::~Widget()
{delete ui;
}

2、moveToThread()方法

这种方法是 自定义一个工作类,然后让这个工作类在线程里面运行,而他和主线程的通信方法,通过信号与槽来实现。

#ifndef WORKER_H
#define WORKER_H#include <QObject>class worker : public QObject
{Q_OBJECT
public:explicit worker(QObject *parent = nullptr);private:signals:public slots:void onbuttonpush();};#endif // WORKER_H
#include "worker.h"
#include <QDebug>#include <QThread>worker::worker(QObject *parent): QObject{parent}
{}void worker::onbuttonpush()
{qDebug()<<"worker::"<<QThread::currentThreadId();
}
#include "widget.h"
#include "ui_widget.h"
#include "mythread.h"
#include "worker.h"
#include <QThread>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);worker *work = new worker();QThread *thread = new QThread();work->moveToThread(thread);thread->start();connect(this,&Widget::push,work,&worker::onbuttonpush);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{qDebug()<<"Widget::"<<QThread::currentThreadId();emit push();
}

http://www.lryc.cn/news/345717.html

相关文章:

  • 设计模式——迭代器模式(Iterator)
  • 在k8s中安装Grafana并对接Prometheus,实现k8s集群监控数据的展示
  • 【JavaScript】内置对象 - 数组对象 ③ ( 数组反转 - reverse 方法 | 数组排序 - sort 方法 | 自定义数组排序规则 )
  • ctfshow web入门 php反序列化 web267--web270
  • 智慧公厕解决什么问题?实现了什么样的价值?
  • IATF16949认证是什么?
  • 【Vue2】关于response返回数据的错误小记
  • 深入理解C++构造函数和析构函数
  • CMakeLists.txt语法规则:数学运算 math
  • 图片无损压缩工具-VIKY
  • 【Linux操作系统】:文件操作
  • 渗透之sql注入----二次注入
  • LeetCode 每日一题 ---- 【2105. 给植物浇水 II】
  • 【刷题】代码随想录算法训练营第三十五天|435、无重叠区间,763、划分字母区间 ,56、合并区间
  • 【JVM】了解JVM规范中的虚拟机结构
  • 西藏在线教育系统哪家好,培训机构为什么讲师流动大?该如何留住讲师?
  • 智能文档提取
  • 封装Springboot基础框架功能-03
  • 汽车EDI:IAC Elmdon EDI 对接指南
  • IPFoxy:什么是静态住宅IP?静态ISP代理指南
  • 【算法】高精度(string实现)
  • 宝塔面板如何删除一个站点
  • Android RecyclerView
  • 【QT教程】QT6命令行工具开发 QT命令行
  • 基于Springboot的微乐校园管理系统(有报告)。Javaee项目,springboot项目。
  • 【第6节课笔记】LagentAgentLego
  • 【ARMv8/v9 系统寄存器 4 -- ARMv8 通用寄存器详细介绍】
  • 一个月速刷leetcodeHOT100 day 01
  • Cargo - 构建 rust项目、管理依赖包
  • 内网安全-代理Socks协议路由不出网后渗透通讯CS-MSF控制上线简单总结