qt 类中的run线程

在Qt中,QThread类的run()方法是线程的执行入口,它是由QThread内部自动调用的,而不是用户直接调用。

详细解释:
QThread类:

QThread是Qt的线程类,提供了用于多线程操作的接口。我们可以创建QThread对象并将任务放入其中执行。线程的实际执行是通过继承QThread类并重写run()方法,或者使用moveToThread()将一个QObject对象的槽移至子线程中来实现的。
run()方法:

QThread的run()方法是一个虚函数,当你启动线程时,run()方法会被自动调用。通常情况下,我们不会直接调用run()方法,而是使用start()方法来启动线程。调用start()方法后,QThread会在新线程中自动调用run()。
使用QThread的两种方式:
通过继承QThread并重写run()方法:

这种方式比较简单,但也有一些限制,比如在run()方法中不建议进行Qt的UI操作,因为Qt的UI只能在主线程中操作。

class WorkerThread : public QThread
{
public:void run() override {// 线程要执行的工作for (int i = 0; i < 5; ++i) {qDebug() << "Running in thread";QThread::sleep(1);}}
};int main(int argc, char *argv[]) {QCoreApplication app(argc, argv);WorkerThread thread;thread.start(); // 启动线程,调用run()thread.wait(); // 等待线程结束return app.exec();
}

在这个例子中:

你可以看到,run()方法会在调用start()时被自动调用。
start()方法会启动新线程,然后在新线程中自动执行run()方法。
通过moveToThread()将QObject对象移至工作线程:

这是更常用的做法,因为它允许你将现有的QObject对象放入工作线程,而不需要直接继承QThread。

class Worker : public QObject
{Q_OBJECT
public slots:void doWork() {for (int i = 0; i < 5; ++i) {qDebug() << "Working in thread";QThread::sleep(1);}}
};int main(int argc, char *argv[]) {QCoreApplication app(argc, argv);QThread thread;Worker worker;worker.moveToThread(&thread); // 将worker对象移到线程中QObject::connect(&thread, &QThread::started, &worker, &Worker::doWork); // 连接信号和槽QObject::connect(&worker, &Worker::finished, &thread, &QThread::quit); // 工作完成后退出线程QObject::connect(&worker, &Worker::finished, &worker, &QObject::deleteLater); // 工作完成后删除workerthread.start(); // 启动线程,调用worker的doWork()thread.wait(); // 等待线程结束return app.exec();
}

在这个例子中:

我们创建了一个Worker类,并将它移到QThread中运行。
当线程启动时,它会调用doWork()槽方法(而不是直接调用run())。
moveToThread()将worker对象移至QThread中执行任务,doWork()方法在新线程中运行。
总结:
QThread::run():这是QThread类的虚函数,当你调用start()方法时,run()方法会被自动调用,执行你在线程中需要完成的任务。你通常不会直接调用run()方法。

线程启动:

当你使用QThread时,线程通过调用start()方法启动。
线程内的工作是通过重写run()或使用moveToThread()和槽来完成的。
moveToThread():这是将QObject对象移到一个新的线程中,这样你可以在子线程中执行工作,而不需要继承QThread。

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

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

相关文章

ElasticSearch 数据聚合与运算

1、数据聚合 聚合&#xff08;aggregations&#xff09;可以让我们极其方便的实现数据的统计、分析和运算。实现这些统计功能的比数据库的 SQL 要方便的多&#xff0c;而且查询速度非常快&#xff0c;可以实现近实时搜索效果。 注意&#xff1a; 参加聚合的字段必须是 keywor…

人工智能浪潮来袭:2024年技术革命与产业变革深度解析@附64页PDF文件下载

随着2024年的到来&#xff0c;人工智能&#xff08;AI&#xff09;技术正以前所未有的速度、广度和深度改变着我们的生产和生活方式。在这篇深度解析中&#xff0c;我们将带您一探AI技术的最新发展、产业应用的现状以及未来的安全治理趋势。 技术革命&#xff1a;AI技术的新范…

python 渗透测试开发工具之 子域名查询 python脚本逻辑 开发 高阶逻辑思维 CDN解析流程细分到信息收集的域名以及子域名分析

目录 知识点说明 域名收集是信息收集的一部分 而域名分为主域名以及子域名 所以 最后 域名说明 前提 解释域名域IP得作用 DNS解析流程【必控知识点】 解析总结 域名是什么 域名得分段解释 www.baidu.com【必控知识点】 从技术角度来看 总结: 信息收集子域名…

搭建分布式ZooKeeper集群

title: 搭建分布式ZooKeeper集群 date: 2024-11-26 23:39:00 categories: - 服务器 tags: - ZooKeeper - 大数据搭建分布式ZooKeeper集群 本次实验环境&#xff1a;Centos 7-2009、Hadoop-3.1.4、JDK 8、Zookeeper-3.6.3 前提 首先配置好Hadoop集群 为了配置方便&#xff0c…

Python高级游戏开发:打造一款塔防游戏

塔防(Tower Defense)游戏是一种经典的游戏类型,玩家通过建造防御塔来阻止敌人入侵。本文将介绍如何使用Python和Pygame库开发一款简单但高级的塔防游戏,涵盖地图设计、敌人路径规划、防御塔机制以及游戏逻辑实现。 一、游戏开发环境配置 1. 安装Pygame Pygame是Python中最…

unity 雷达

unity 雷达 首先去商店下载TouchScript插件 导入的时候勾选Enable TUIO 然后把预制体Cursors和TouchManager拖上 最后把TuioInput这个脚本挂上 脚本上的端口号尽量不改

F5中获取客户端ip地址(client ip)

当F5设备对其原始设置上的所有IP地址使用NAT时&#xff0c;连接到poo成员&#xff08;nodes、backend servers&#xff09;的出站连接将是NAT IP地址。 pool 成员&#xff08;nodes、backend servers&#xff09;将无法看到真实的客户端 ip地址&#xff0c;因为看到的是F5上的…

白话java设计模式

创建模式 单例模式&#xff08;Singleton Pattern&#xff09;&#xff1a; 就是一次创建多次使用&#xff0c;它的对象不会重复创建&#xff0c;可以全局来共享状态。 工厂模式&#xff08;Factory Method Pattern&#xff09;&#xff1a; 可以通过接口来进行实例化创建&a…

MATLAB引用矩阵元素的几种方法

引用矩阵元素可以通过索引&#xff0c;也可以通过逻辑值 索引 通过引用元素在矩阵中的位置来提取元素&#xff0c;例如&#xff1a; - 逻辑值 通过某种逻辑运算来使得要提取的值变为逻辑 1 1 1&#xff0c;用 A ( ) A() A()提取即可&#xff0c; A A A为原矩阵的名称。 例如&…

Python发送带key的kafka消息

在Python中发送带有键&#xff08;key&#xff09;的Kafka消息&#xff0c;通常会使用confluent-kafka或kafka-python这样的库。这里我将分别展示如何使用这两个库来实现这个功能。 ### 使用 confluent-kafka 首先&#xff0c;确保你已经安装了confluent-kafka库。如果没有安装…

机器学习预处理-表格数据的空值处理

机器学习预处理-表格数据的空值处理 机器学习预处理-表格数据的分析与可视化中详细介绍了表格数据的python可视化&#xff0c;可视化能够帮助我们了解数据的构成和分布&#xff0c;是我们进行机器学习的必备步骤。上文中也提及&#xff0c;原始的数据存在部分的缺失&#xff0…

了解 SpringMVC 请求流程

文章目录 1. Spring 基础 - SpringMVC 请求流程1.1 引入1.2 什么是 MVC1.3 什么是 Spring MVC1.4 请求流程核心架构的具体流程步骤补充 1.5 案例**Maven 包引入****业务代码的编写**DaoServiceControllerwebapp 下的 web.xmlspringmvc.xmlJSP 视图 2. Spring 进阶 - Dispatcher…

【mysql】如何解决主从架构从库延迟问题

目录 1. 说明2.优化主库的写入性能3. 优化网络性能4. 增强从库的硬件性能5. 调整从库的配置6. 主从架构优化7. 监控和调优8.使用 GTID 和 Group Replication 1. 说明 1.在 MySQL 数据库中&#xff0c;从库延迟&#xff08;replication lag&#xff09;是指主库和从库之间的数据…

Springboot3.x配置类(Configuration)和单元测试

配置类在Spring Boot框架中扮演着关键角色&#xff0c;它使开发者能够利用Java代码定义Bean、设定属性及调整其他Spring相关设置&#xff0c;取代了早期版本中依赖的XML配置文件。 集中化管理&#xff1a;借助Configuration注解&#xff0c;Spring Boot让用户能在一个或几个配…

鸿道Intewell-C纯实时构型,适合有功能安全认证需求的工业操作系统

鸿道Intewell-C纯实时构型&#xff0c;适合有功能安全认证需求的工业操作系统 鸿道Intewell-C是一款工业实时微内核操作系统&#xff0c;由科东软件自主研发&#xff0c;具有超低延迟和最小抖动&#xff0c;保障工业设备可以高效处理时间敏感的现场业务&#xff0c;支持多种工…

Stream– ESP8266物联网应用,(客户端向服务器发送数据信息 客户端向服务器请求数据信息)

Stream– ESP8266物联网应用 Stream对于ESP8266-Arduino语言来说指的是数据序列。请留意&#xff1a;在C编程中Stream常被翻译作“流”。我们认为将Stream称为数据序列更加直观。因为数据序列这一概念有两个很关键特点。 第一个特点是“序”&#xff0c;即数据序列不能是杂乱…

提升PHP技能:18个实用高级特性

掌握PHP基础知识只是第一步。 深入了解这18个强大的PHP特性&#xff0c;将显著提升您的开发效率和代码质量。 1、超越 __construct() 的魔法方法 虽然 __construct() 为大多数开发者所熟知&#xff0c;PHP 却提供了更多强大的魔术方法&#xff0c;例如&#xff1a; class Da…

Spring MVC 请求头中 ContentType和DataType区别

一、Spring MVC 请求头中ContentType和DataType区别用途 1. dataType【通常在JQuery中使用】 定义&#xff1a;dataType 通常用于描述前端希望从服务器接收的数据格式。常见场景&#xff1a;这是前端参数&#xff0c;通常在 jQuery.ajax 或其他前端框架中使用&#xff0c;告诉…

Vue 3 中的 `update:modelValue` 事件详解

在 Vue 3 中&#xff0c;update:modelValue​ 事件通常与 v-model​ 指令一起使用&#xff0c;以实现自定义组件的双向数据绑定。以下是对该事件的详细分析&#xff1a; 事件定义 首先&#xff0c;我们需要在组件中定义 update:modelValue​ 事件。可以使用 defineEmits​ 函…

芯品荟|SWM221系列芯片之TFTLCD彩屏显示及控制

“革新未来&#xff0c;智驭控制新纪元”&#xff0c;由广东华芯微特集成电路有限公司市场总监张琢&#xff0c;对SWM221系列的强大功能表现进行了整体介绍。 确实&#xff0c;华芯微特在TFTLCD显示及控制有十多年应用基础和积累的团队&#xff0c;仍勇于挑战&#xff0c;自我…