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

【Qt】多线程

线程创建

自定义线程类

#ifndef CUSTOMETHREAD_H
#define CUSTOMETHREAD_H#include <QObject>
#include <QThread>
#include "add.h"class CustomeThread : public QThread
{Q_OBJECT
public:// Bind the thread kernel function.explicit CustomeThread(Add*& addPtr);private:// Run the thread kernel functionvirtual void run() override;
private:Add* m_addFuc {nullptr};
};#endif // CUSTOMETHREAD_H

主函数

#include <QCoreApplication>
#include <QDebug>
#include <QThread>
#include "add.h"
#include "customethread.h"int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);qDebug() << "Current thread id: " << QThread::currentThreadId();//Concrator the thread kernel function object.Add* ladd = new Add(); CustomeThread* thread = new CustomeThread(ladd);thread->start();return a.exec();
}

结果:

Current thread id:  0x36d0
current Thread:  0x7f50
100  +  200  =  300

计算的核心函数在子线程中进行。
通过创建一个线程的controller 类,绑定线程执行的kernel函数。然后再子线程的run函数里执行 kernel 函数。

改进

上面的程序中 kernel 函数和 执行线程并没有在同一个线程下,所以虽然Qt通过跨线程调用的机制,在子线程调用成功了,但是终究是一种不安全的方式,所以,为了保险起见,需要将 kernel函数再移入子线程。

#include <QCoreApplication>
#include <QDebug>
#include <QThread>
#include "add.h"
#include "customethread.h"int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);qDebug() << "Current thread id: " << QThread::currentThreadId();//Concrator the thread kernel function object.Add* ladd = new Add(); CustomeThread* thread = new CustomeThread(ladd);ladd->moveToThread(thread);thread->start();return a.exec();
}

线程循环

事件循环

int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);return a.exec();
}

上面的 a.exec() 即让程序进入系统的事件循环,事件循环是一个特殊的死循环,其作用如下:

  • 阻塞程序,使得线程一直执行。
  • 在循环内部可以不断的监听系统发来的信号,并作出反应。
#include <QCoreApplication>
#include <QDebug>
#include <QThread>
#include <QTimer>
#include <QObject>#include "add.h"
#include "customethread.h"int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);qDebug() << "Current thread id: " << QThread::currentThreadId();Add* ladd = new Add();CustomeThread* thread = new CustomeThread(ladd);ladd->moveToThread(thread);thread->start();QTimer* timer = new QTimer();QObject::connect(timer, SIGNAL(timeout()), ladd, SLOT(add()));return a.exec();
}

在这个例子里面,使用了一个定时器,向子线程里的 kernel 对象发送信号,出发 add() 槽函数。但是最后并没有触发到。一个原因是: 此时的 ladd 已经在子线程了, 直接连接信号槽,大部分时候只能在信号和槽函数在同一个线程时生效。比如,我们不把 ladd移动到子线程中:

int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);qDebug() << "Current thread id: " << QThread::currentThreadId();Add* ladd = new Add();CustomeThread* thread = new CustomeThread(ladd);// Not move ladd to subthread!!!!//ladd->moveToThread(thread);thread->start();QTimer* timer = new QTimer();QObject::connect(timer, SIGNAL(timeout()), ladd, SLOT(add()));return a.exec();
}
Main thread id:  0x5628
Current Thread:  0x5628
100  +  100  =  200
Current Thread:  0x5628
100  +  100  =  200
Current Thread:  0x5628
100  +  100  =  200
Current Thread:  0x5628
100  +  100  =  200
Current Thread:  0x5628
100  +  100  =  200

如何子线程的对象发信号?

可以这样连接信号和操

QObject::connect(timer, SIGNAL(timeout()), ladd, SLOT(add()), Qt::QueuedConnection);

向子线程发了信号,子线程就能接受吗?

但是发现即时这样也不能向子线程发信号,这是因为子线程中的run函数并没有调用事件循环,此时子线程已经结束退出了,所以可以在子线程的run函数中增加事件循环

void CustomeThread::run()
{exec();
}
Main thread id:  0x5384
Current Thread:  0x1638
100  +  100  =  200
Current Thread:  0x1638

自定义事件循环

相关文章:

【Qt】多线程

线程创建 自定义线程类 #ifndef CUSTOMETHREAD_H #define CUSTOMETHREAD_H#include <QObject> #include <QThread> #include "add.h"class CustomeThread : public QThread {Q_OBJECT public:// Bind the thread kernel function.explicit CustomeThre…...

腾讯云GPU服务器GN7实例NVIDIA T4 GPU卡

腾讯云GPU服务器GN7实例搭载1颗 NVIDIA T4 GPU&#xff0c;8核32G配置&#xff0c;系统盘为100G 高性能云硬盘&#xff0c;自带5M公网带宽&#xff0c;系统镜像可选Linux和Windows&#xff0c;地域可选广州/上海/北京/新加坡/南京/重庆/成都/首尔/中国香港/德国/东京/曼谷/硅谷…...

3. 爬取自己CSDN博客列表(自动方式)(分页查询)(网站反爬虫策略,需要在代码中添加合适的请求头User-Agent,否则response返回空)

文章目录 步骤打开谷歌浏览器输入网址按F12进入调试界面点击网络&#xff0c;清除历史消息按F5刷新页面找到接口&#xff08;community/home-api/v1/get-business-list&#xff09;接口解读 撰写代码获取博客列表先明确返回信息格式json字段解读 Apipost测试接口编写python代码…...

利用HTTP代理实现请求路由

嘿&#xff0c;大家好&#xff01;作为一名专业的爬虫程序员&#xff0c;我知道构建一个高效的分布式爬虫系统是一个相当复杂的任务。在这个过程中&#xff0c;实现请求的路由是非常关键的。今天&#xff0c;我将和大家分享一些关于如何利用HTTP代理实现请求路由的实用技巧&…...

深度学习(36)—— 图神经网络GNN(1)

深度学习&#xff08;36&#xff09;—— 图神经网络GNN&#xff08;1&#xff09; 这个系列的所有代码我都会放在git上&#xff0c;欢迎造访 文章目录 深度学习&#xff08;36&#xff09;—— 图神经网络GNN&#xff08;1&#xff09;1. 基础知识2.使用场景3. 图卷积神经网…...

深入理解JVM——垃圾回收与内存分配机制详细讲解

所谓垃圾回收&#xff0c;也就是要回收已经“死了”的对象。 那我们如何判断哪些对象“存活”&#xff0c;哪些已经“死去”呢&#xff1f; 一、判断对象已死 1、引用计数算法 给对象中添加一个引用计数器&#xff0c;每当有一个地方引用它时&#xff0c;计数器就加一&…...

基于SSH框架实现的管理系统(包含java源码+数据库)

资料下载链接 介绍 基于SSH框架的管理系统 简洁版 &#xff1b; 实现 登录 、 注册 、 增 、 删 、 改 、 查 &#xff1b; 可继续完善增加前端、校验、其他功能等&#xff1b; 可作为 SSH&#xff08;Structs Spring Hibernate&#xff09;项目 开发练习基础模型&#xf…...

图像识别代做服务:实现创新应用的新契机

导言&#xff1a; 随着人工智能和图像处理技术的不断进步&#xff0c;图像识别已经成为了许多领域中的关键应用。然而&#xff0c;图像识别技术的开发和应用往往需要庞大的团队和大量的资源。这就是为什么图像识别代做服务正在崭露头角。本文将探讨图像识别代做服务如何成为实现…...

Coreutils工具包,Windows下使用Linux命令

之前总结过两篇有关【如何在Windows系统下使用Linux的常用命令】的文章&#xff1a; GnuWin32&#xff0c;Windows下使用Linux命令 UnxUtils工具包&#xff0c;Windows下使用Linux命令 今天再推荐一个类似的工具包Coreutils 一、简介 GNU core utilities是GNU操作系统基本…...

神经网络基础-神经网络补充概念-13-python中的广播

概念 在 Python 中&#xff0c;广播&#xff08;Broadcasting&#xff09;是一种用于在不同形状的数组之间执行二元操作的机制。广播允许你在不显式复制数据的情况下&#xff0c;对不同形状的数组进行运算。这在处理数组的时候非常有用&#xff0c;尤其是在科学计算、数据分析…...

HDFS原理剖析

一、概述 HDFS是Hadoop的分布式文件系统&#xff08;Hadoop Distributed File System&#xff09;&#xff0c;实现大规模数据可靠的分布式读写。HDFS针对的使用场景是数据读写具有“一次写&#xff0c;多次读”的特征&#xff0c;而数据“写”操作是顺序写&#xff0c;也就是…...

css学习2(利用id与class修改元素)

1、id选择器可以为标有特定id的html元素指定特定的样式。 2、选择器以#开头&#xff0c;后跟某id的属性值。 3、class选择器用于描述一组元素的样式&#xff0c;class可以在多个元素使用。 4、类选择器用.选择。 5、指定特定的元素使用class。 6、元素的多个类用空格分开&…...

wsl2(debian)安装python的不同版本例如3.8

要在Debian上安装 Python 3.8&#xff0c;可以按照以下步骤操作&#xff1a; 1.确保你的 Debian 系统已经更新到最新版本&#xff0c;可以使用以下命令更新&#xff1a; sudo apt update sudo apt upgrade2.安装 Python 3.8 的依赖项&#xff0c;以及构建 Python 时需要的工具…...

Python教程(9)——Python变量类型列表list的用法介绍

列表操作 创建列表访问列表更改列表元素增加列表元素修改列表元素删除列表元素 删除列表 在Python中&#xff0c;列表&#xff08;list&#xff09;是一种有序、可变的数据结构&#xff0c;用于存储多个元素。列表可以包含不同类型的元素&#xff0c;包括整数、浮点数、字符串等…...

springboot+VUE智慧公寓管理系统java web酒店民宿房屋住宿报修信息jsp源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 springbootVUE智慧公寓管理系统 系统有2权限&#xf…...

神经网络基础-神经网络补充概念-36-dropout正则化

概念 Dropout 是一种常用的正则化技术&#xff0c;用于减少深度神经网络中的过拟合问题。它在训练过程中随机地将一部分神经元的输出置为零&#xff0c;从而强制模型在训练过程中学习多个独立的子模型&#xff0c;从而减少神经元之间的依赖关系&#xff0c;提高模型的泛化能力…...

Go语言基础之变量和常量

标识符与关键字 标识符 在编程语言中标识符就是程序员定义的具有特殊意义的词&#xff0c;比如变量名、常量名、函数名等等。 Go语言中标识符由字母数字和_(下划线&#xff09;组成&#xff0c;并且只能以字母和_开头。 举几个例子&#xff1a;abc, _, _123, a123 关键字 关…...

Spring Boot 项目实现 Spring AOP

【注】实现在SpringBoot项目中&#xff0c;同时给两个类的方法添加AOP前置通知 1、创建一个SpringBoot项目 2、创建两个目标类和方法 package com.tqazy.learn_spring_project.spring_aop;import org.springframework.stereotype.Service;/*** ClassName SpringAopUserServi…...

Baumer工业相机堡盟工业相机如何通过BGAPISDK设置相机的固定帧率(C#)

Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的固定帧率&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机的固定帧率功能的技术背景CameraExplorer如何查看相机固定帧率功能在BGAPI SDK里通过函数设置相机固定帧率 Baumer工业相机通过BGAPI SDK设置相机固定帧…...

js拼接字符串

在js中&#xff0c;你可以使用字符串拼接的方式创建新的字符串。 下面是一些常用的方法&#xff1a; 1、使用运算符&#xff1a; var str1 "Hello"; var str2 "World"; var result str1 " " str2; console.log(result); // 输出&#xf…...

27考研er必备的那些学习工具!

对2027考研人来说&#xff0c;备考不是简单地“埋头刷题”&#xff0c;而是一场关于信息筛选、资源整合、时间管理和学习效率的长期战役。面对公共课、专业课、院校信息、经验帖、课程资源等海量内容&#xff0c;选对工具往往能让复习少走弯路。 以下这些平台和网站&#xff0c…...

脉冲神经网络(SNN)稀疏计算加速与RISC-V优化实践

1. 脉冲神经网络与稀疏计算加速概述 脉冲神经网络&#xff08;SNN&#xff09;作为第三代神经网络模型&#xff0c;其最大特点是采用生物神经元类似的脉冲信号进行信息传递。与传统人工神经网络&#xff08;ANN&#xff09;的连续激活不同&#xff0c;SNN只在膜电位达到阈值时才…...

PHPWord替换word模板内容时,存在表格,且不确定表格行数的处理方式

PHPWord替换word模板内容时,存在表格,且不确定表格行数的处理方式 想得到的目标表格 表格可能存在若干行,需要循环生成,插入到word模板中 word模板 实现过程 1、Composer安装 phpword composer require phpoffice/phpword2、实现代码 //模拟数据 $data = [[...

如何为本地音乐库批量下载同步歌词:LRCGET终极指南

如何为本地音乐库批量下载同步歌词&#xff1a;LRCGET终极指南 【免费下载链接】lrcget Utility for mass-downloading LRC synced lyrics for your offline music library. 项目地址: https://gitcode.com/gh_mirrors/lr/lrcget 还在为海量本地音乐文件找不到歌词而烦恼…...

Win10显示器关闭就锁屏?一个注册表键值让你告别烦人锁屏(附详细路径)

Win10显示器关闭后自动锁屏的终极解决方案&#xff1a;注册表深度优化指南 1. 问题背景与用户痛点 每当我们在Windows 10系统中设置显示器自动关闭以节省能源时&#xff0c;常常会遇到一个令人困扰的现象&#xff1a;显示器关闭后不久&#xff0c;系统就会自动进入锁屏状态。这…...

保姆级教程:用ESP32 AT固件实现手机蓝牙配对,从编译到连接一次搞定

ESP32蓝牙开发实战&#xff1a;从固件编译到手机配对的完整指南 在物联网设备开发中&#xff0c;蓝牙连接是最基础也最常用的功能之一。ESP32作为一款高性价比的Wi-Fi/蓝牙双模芯片&#xff0c;凭借其出色的性能和丰富的开发资源&#xff0c;已经成为智能家居、可穿戴设备等领域…...

别再只改IMEI了!深入理解高通基带QCN:从参数结构到软件检测的完整对抗思路

高通基带QCN参数体系解析与多维设备指纹对抗策略 在移动设备安全领域&#xff0c;设备标识参数的修改与检测始终是一场动态博弈。随着安卓系统安全机制的不断升级&#xff0c;简单的IMEI修改早已无法应对现代应用的多维指纹检测体系。理解高通基带QCN参数的组织结构及其在系统中…...

Linux应用健康端点实战指南

Linux应用健康端点实战指南本文面向具备一定 Linux 基础的技术人员&#xff0c;围绕应用健康端点展开&#xff0c;重点讨论健康接口、依赖检查和负载均衡摘除。在中级运维和系统管理工作中&#xff0c;这类主题常常与配置变更、资源状态、权限边界、自动化任务和业务影响交织在…...

Windows驱动存储管理终极指南:DriverStore Explorer高效清理系统驱动垃圾

Windows驱动存储管理终极指南&#xff1a;DriverStore Explorer高效清理系统驱动垃圾 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer Windows驱动存储管理是系统管理员和高级用户面临的…...

告别内存焦虑!手把手教你读懂中科蓝讯AB530X的ram.ld文件,精准控制RAM复用

告别内存焦虑&#xff01;手把手教你读懂中科蓝讯AB530X的ram.ld文件&#xff0c;精准控制RAM复用 第一次打开中科蓝讯AB530X的ram.ld文件时&#xff0c;那些密密麻麻的符号和数字让我头皮发麻。作为一款主打性价比的蓝牙芯片&#xff0c;AB530X的RAM资源相当有限——就像在寸土…...