qt创建线程的四种方式

embedded/2025/1/2 2:17:41/

第一种

继承QThread类,然后重写run()函数

// 线程一
Mythread1 = new CMyThread;
connect(Mythread1,&CMyThread::sig_num,this,&MainWindow::slots_thread1);
connect(ui->pushButton,&QPushButton::clicked,[=](){Mythread1->m_state = ThreadState::RUN;Mythread1->start();});
connect(ui->pushButton_2,&QPushButton::clicked,[=](){Mythread1->m_state = ThreadState::STOP;});

第二种

创建一个线程,然后将要做的逻辑放到你创建的线程里。

 // 线程二Mythread2 = new CMyThreadTwo;m_thread2 = new QThread;Mythread2->moveToThread(m_thread2);connect(this,&MainWindow::sig_StartThread2,Mythread2,&CMyThreadTwo::slots_start);connect(Mythread2,&CMyThreadTwo::sig_num,this,&MainWindow::slots_thread2);bool b = connect(ui->pushButton_3,&QPushButton::clicked,[=](){Mythread2->m_state = ThreadState::RUN;m_thread2->start();emit sig_StartThread2();//Mythread2->Task();});connect(ui->pushButton_4,&QPushButton::clicked,[=](){Mythread2->m_state = ThreadState::STOP;});

第三种

run就完了!

// 线程三
connect(ui->pushButton_5,&QPushButton::clicked,[=](){m_state3 = ThreadState::RUN;QtConcurrent::run(this,&MainWindow::thread3);});
connect(ui->pushButton_6,&QPushButton::clicked,[=](){m_state3 = ThreadState::STOP;});

QtConcurrent::run是 Qt 框架提供的一个方便的函数,用于在一个单独的线程中运行一个函数。它允许你简单地将一个可调用对象(如函数、函数对象、lambda 表达式等)放到一个新的线程中执行,从而实现异步操作,避免阻塞主线程。这在处理一些耗时的任务(如文件读取、复杂的计算等)时非常有用,可以提高应用程序的响应速度和性能。

启动的时候用start()启动。如果直接调用的是run()函数的话,并不会创建一个新线程,任然是在主线程。

第四种

线程池

创建线程池,定义任务类,然后将任务放到线程池中

QThreadPool pool;
pool.setMaxThreadCount(5); // 设置线程池最大线程数为5//任务类
class PrintNumberTask : public QRunnable
{
public:void run() override{qDebug() << "Printing a number from a thread in the pool.";}
};int main()
{PrintNumberTask *task = new PrintNumberTask();QThreadPool::globalInstance()->start(task);// 或者使用自定义的线程池对象// pool.start(task);return 0;
}


http://www.ppmy.cn/embedded/149927.html

相关文章

电商数据的安全与隐私保护:API接口的角色

在电子商务领域&#xff0c;数据安全与隐私保护是企业运营和消费者信任的核心。随着电商平台的日益复杂化和互联网技术的快速发展&#xff0c;API&#xff08;应用程序接口&#xff09;作为系统间通信的桥梁&#xff0c;在数据安全与隐私保护中扮演着至关重要的角色。本文将从A…

React里使用uuid插件--生成随机的id

介绍 UUID (Universally Unique Identifier) 是一种标准的无需中心协调机构就能生成的一个独特标识符&#xff0c;通常用于在并发环境下作为数据库记录的唯一标识 &#xff0c;也可以用于其他需要生成唯一标识的场景。 常用的版本&#xff1a; UUIDv1 &#xff1a;包含时间戳…

Apollo中间件技术:从入门到精通

一、引言 在Java开发的微服务架构中&#xff0c;配置管理是一个不可或缺的重要环节。随着服务数量的增加和部署环境的复杂化&#xff0c;传统的手动配置管理方式已难以满足需求。Apollo作为一款开源的分布式配置中心&#xff0c;凭借其强大的功能和灵活的架构&#xff0c;成为…

[江科大STM32] 第五集STM32工程模板——笔记

保存&#xff0c;进去选芯片型号&#xff0c;我们是F10C8T6 再添加一些文件&#xff0c;自己看路径 然后去 复习这三文件 打开KEIL add existing那个&#xff0c;添加已经存在的文件 还有5个.c.h文件也要添加进来 回到KEIL 点击旁边的settings 如果你用寄存器开发就建到这里就可…

交易生态全解析:聚合交易平台 交易策略平台 技术策略提供方 交易机器人平台 资管、支付平台 社交交易社区 跟单平台在饼圈量化的定义和关系是怎样的?

币圈平台及功能概览&#xff1a; 在币圈&#xff0c;多个平台为用户提供交易自动化、策略制定、机器人执行、社交跟单等服务。下面是各平台的定义和分类&#xff1a; 定义与分类&#xff1a; 技术策略提供方&#xff1a;提供基础交易信号和策略支持。交易策略平台&#xff1…

上手教程:使用Terraform打造弹性VPC架构

最近Akamai发布的虚拟专用云&#xff08;VPC&#xff09;功能提供了一种隔离的网络&#xff0c;让云资源可以用私密的方式进行通信。 关于Akamai VPC功能&#xff0c;最棒的地方在于它有着极高的灵活性。用户可以通过Cloud Manager、开发人员工具&#xff08;如CLI&#xff09…

Go语言高并发实战案例分析

目录 基础案例&#xff1a;简单的并发下载器进阶案例&#xff1a;高并发网站访问统计实战案例&#xff1a;分布式任务调度系统 基础案例&#xff1a;简单的并发下载器 问题描述 需要同时下载多个文件&#xff0c;使用并发方式提高下载效率。 实现代码 package mainimport…

Redis篇--应用篇3--数据统计(排行榜,计数器)

由于 Redis 的原子操作&#xff0c;它非常适合用于计数器&#xff0c;例如统计网站的访问量、点赞数等。 如投票&#xff0c;计算评分&#xff0c;根据评分来决定如何排序和展示。 如果需要防止重复投票&#xff0c;可以使用一个SET集合存储用户id与投票用户id。 如果想要实现…