Qt多线程编程

本章介绍Qt多线程编程。

1.方法

Qt多线程编程通常有2种方法:

1)通过继承QThread类,实现run()方法。

2)采用QObject::moveToThread()方法。

方法2是Qt官方推荐的方法,本文介绍第2种。

2.步骤

1)创建Worker类

这里的Worker类就是我们需要作复杂的数据处理的地方(doWork()函数),需要注意的是Worker类需要继承QObject类。

class Worker : public QObject
{Q_OBJECT
public:explicit Worker(QObject *parent = nullptr);signals:void resultReady(int result);public slots:void doWork(int parameter);
};

2)实例化QThread对象和Work对象(包含耗时的数据处理)

在需要使用线程的类中,实例化QThread对象和Worker对象。

workerThread = new QThread(this);
worker = new Worker();

3)QObject::moveToThread()方法

使用QObject::moveToThread()方法将Worker对象的事件循环全部交由QThread对象处理。

worker->moveToThread(workerThread);

4)信号,槽绑定这里列出必要的信号和槽绑定,包括起始信号,结束信号的槽绑定。

connect(this, SIGNAL(startWork(int)), work, SLOT(doWork(int)));
connect(workerThread, &QThread::finished, worker, &QObject::deleteLater);

这样,线程使用者就可以向Worker对象发信号来执行相应的操作,同样,Worker对象也可以将结果发给线程使用者。

5)启动线程

workerThread->start();

6)善后处理

当使用线程的对象销毁时,需要作必要的处理。在其析构函数中添加:

workerThread->quit();
workerThread->wait();

3.实例

以Controller对象中实现多线程为例。这里为了演示,在Worker线程中作加法运算来模拟耗时的数据处理。在Controller类和Worker类各定义了信号和槽来实现Worker类和Controller类之间的交互。

1)Worker类:

#ifndef WORKER_H
#define WORKER_H#include <QObject>class Worker : public QObject
{Q_OBJECT
public:explicit Worker(QObject *parent = nullptr);signals:void resultReady(int result);public slots:void doWork(int parameter);
};#endif // WORKER_H
#include "worker.h"
#include <QThread>
#include <QDebug>Worker::Worker(QObject *parent) : QObject(parent)
{}void Worker::doWork(int parameter)
{int sum = 0;qDebug() << "Thread2 ID: " << QThread::currentThreadId();for (int i = 1; i <= parameter; i++)sum += i;emit resultReady(sum);
}

2)Controller类:

#ifndef CONTROLLER_H
#define CONTROLLER_H#include <QObject>
#include "worker.h"class Controller : public QObject
{Q_OBJECT
public:explicit Controller(QObject *parent = nullptr);~Controller();signals:void startWork(int parameter);public slots:void handleResult(int result);private:QThread *workerThread;Worker *worker;
};#endif // CONTROLLER_H
#include "controller.h"
#include <QThread>
#include <QDebug>Controller::Controller(QObject *parent) : QObject(parent)
{workerThread = new QThread(this);worker = new Worker();worker->moveToThread(workerThread);connect(this, SIGNAL(startWork(int)), worker, SLOT(doWork(int)));connect(workerThread, &QThread::finished, worker, &QObject::deleteLater);connect(worker, SIGNAL(resultReady(int)), this, SLOT(handleResult(int)));workerThread->start();
}Controller::~Controller()
{workerThread->quit();workerThread->wait();
}void Controller::handleResult(int result)
{qDebug() << result;
}

3)主函数:

#include <QCoreApplication>
#include <QDebug>
#include <QThread>
#include "controller.h"int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);qDebug() << "Thread1 ID: " << QThread::currentThreadId();Controller c;emit c.startWork(100);return a.exec();
}

4)运行结果:

总结:本文介绍了采用QObject::moveToThread()方法实现Qt多线程编程的方法。

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

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

相关文章

Nginx安装以及LVS-DR集群搭建

Nginx安装 1.环境准备 yum insatall -y make gcc gcc-c pcre-devel #pcre-devel -- pcre库 #安装openssl-devel yum install -y openssl-devel 2.tar安装包 3.解压软件包并创建软连接 tar -xf nginx-1.22.0.tar.gz -C /usr/local/ ln -s /usr/local/nginx-1.22.0/ /usr/local…

1999-2021年全国各地级市专利申请与获得情况、绿色专利申请与获得情况面板数据

1999-2021年全国各地级市专利申请与获得情况、绿色专利申请与获得情况面板数据 1、时间&#xff1a;2000-2021年 2、来源&#xff1a;国家知识产权局 3、范围&#xff1a;地级市&#xff08;具体每年地级市数量参看下文图片&#xff09; 4、指标&#xff1a;申请专利数&…

C语言---数据结构实验---哈夫曼树及哈夫曼编码的算法实现---图的基本操作

文章目录 写在前面哈夫曼树及哈夫曼编码的算法实现实验内容代码实现 图的基本操作实验内容代码实现 写在前面 本篇实验代码非本人写&#xff0c;代码源自外部&#xff0c;经调试解决了部分warning和error后在本地vs上可以正常运行&#xff0c;如有运行失败可换至vs 未来会重构…

【Leetcode】层次遍历||树深度||队列

step by step. 题目&#xff1a; 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; 输入&am…

sd-roop换脸插件安装

安装步骤 首先看官方教程 sd-webui-roop插件&#xff0c; 如下&#xff1a; 执行 pip install insightface0.7.3在web-ui 界面&#xff0c;插件菜单&#xff0c;从网址安装 https://github.com/s0md3v/sd-webui-roopweb-ui 界面重启如果遇到 NoneType object has no attribu…

成集云 | 畅捷通采购单同步至钉钉 | 解决方案

源系统成集云目标系统 介绍 畅捷通是一家专业的金融科技公司&#xff0c;致力于为投资者提供便捷、高效的金融服务。通过畅捷通T的交易方式&#xff0c;投资者可以更加灵活地进行买卖交易&#xff0c;并且在交易完成后即可获得结算款项&#xff0c;无需等待T1的结算周期。 钉…

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑 现在想对一个接口做性能测试&#xff0c;需要测试它多个线程并发下的调用 1.新建测试计划和线程组 略 2.新建http接口 一个完整的http接口包含请求头和请求&#xff0c;这里就需要两个组件&#xff1a;HTTP request、HT…

信创麒麟操作系统卸载docker,并分别用在线、yum、rpm三种方式安装信创的docker

备注&#xff1a;操作前建议对机器打快照备份&#xff0c;或者备份好数据&#xff0c;如未使用&#xff0c;第一次部署的情况可直接操作 一、卸载DataEase自带的docker # 停止服务 service dataease stop# 删除 docker 可执行文件 rm -f /usr/bin/containerd-shim-runc-v2 r…

c++中const修饰成员函数的问题

问题引入&#xff1a; 看下面这一段代码&#xff1a; class Date { public:Date(int year, int month, int day){_year year;_month month;_day day;}void Print(){cout << "Print()" << endl;cout << "year:" << _year <&…

【linux】ssh 和adb connect区别

问&#xff1a;ssh 与ping的区别 答&#xff1a;SSH&#xff08;Secure Shell&#xff09;和Ping是两种完全不同的网络工具。 SSH是一种加密的网络协议&#xff0c;用于安全地远程管理或访问远程计算机。它提供了一种安全的通信方式&#xff0c;可以在不安全的网络上进行远程登…

命令提示符之操作基础(Windows)

打开命令提示符 方法一 打开指定文件的文件夹&#xff0c;在路径栏里输入“cmd”&#xff0c;回车&#xff0c;就进入控制台了。默认路径就是指定文件夹的路径。 方法二 打开指定的文件夹&#xff0c;按住shift键&#xff0c;在空白处右击&#xff0c;在菜单栏中选择“在此处打…

[保研/考研机试] KY129 简单计算器 浙江大学复试上机题 C++实现

描述 读入一个只包含 , -, *, / 的非负整数计算表达式&#xff0c;计算该表达式的值。 输入描述&#xff1a; 测试输入包含若干测试用例&#xff0c;每个测试用例占一行&#xff0c;每行不超过200个字符&#xff0c;整数和运算符之间用一个空格分隔。没有非法表达式。当一行中…