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

QT:QThread 使用案例

问题描述:软件界面打开之前要初始化相机和机械臂,并且在执行扫描点云,配准等操作时,只能单线程运行,导致运行效率低。

解决:使用QThread

首先写一个类如task,成员函数执行的是需要在子线程运行。

task.h: task类需要继承QObject类,startadd()函数内容在子进程运行。

#ifndef TASK_H
#define TASK_H#include <QThread>
#include <QObject>
class task: public QObject
{Q_OBJECTpublic:explicit task(QObject *parent = 0);public slots:void startadd();};#endif // TASK_H

task.cpp:输出线程id,并且隔一秒输出i的值。

#include "task.h"
#include <QDebug>task::task(QObject *parent){}
void task::startadd(){qDebug() << "线程id:" << QThread::currentThreadId();for(int i=0;i<5;i++){qDebug()<<"i的值为: "<< i <<endl;QThread::sleep(1);}
}

mainwindow.h:声明task的对象,并且声明一个线程m_thread,创建一个转到按钮的槽函数,创建信号函数,后面使用emit触发。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include "task.h"QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;task *m;QThread * m_thread;signals:void startAddRequest();private slots:void on_pushButton_clicked();};
#endif // MAINWINDOW_H

mainwindow.cpp:

总结:五步曲
1.类的对象,线程

    m= new task;
    m_thread = new QThread;

2.关联信号和槽,运行startAddRequest()时,触发m对象的函数startadd()

   connect(this,SIGNAL(startAddRequest()),m,SLOT(startadd()));

    qDebug() << "主线程id:" << QThread::currentThreadId();

3.将对象移动m到线程m_thread

    m->moveToThread(m_thread);

4.启动线程

    m_thread->start();

5.发出信号

emit startAddRequest();

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QThread>
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);m= new task;m_thread = new QThread;connect(this,SIGNAL(startAddRequest()),m,SLOT(startadd()));qDebug() << "主线程id:" << QThread::currentThreadId();m->moveToThread(m_thread);m_thread->start();}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{qDebug() << "线程id:" << QThread::currentThreadId();emit startAddRequest();}

补充:

sleep() / msleep() / usleep()

使线程休眠,单位为秒 / 毫秒 / 微秒


http://www.mrgr.cn/news/62122.html

相关文章:

  • python 基础语法 学习
  • 频率限制:WAF保护网站免受恶意攻击的关键功能
  • 基于阿里云服务的移动应用日志管理方案—日志的上传、下载、存档等
  • Java final 关键字详解
  • 智能家居10G雷达感应开关模块,飞睿智能uA级别低功耗、超高灵敏度,瞬间响应快
  • Conditional DETR论文笔记
  • 【Redis:原理、架构与应用】
  • JavaScript 实战技巧:让你成为前端高手的必备知识2
  • 【热管理】日本三洋 sanace 散热风扇
  • 阿里巴巴店铺商品API返回值中的商品分类与筛选条件
  • Docker:存储原理
  • 理解处理器寻址
  • “胖东来”进京赶考,永辉有救了?
  • 睿亚资产郭威:公益路上的坚定行者,照亮希望之光
  • 大数据治理:确保数据价值与合规性的战略框架
  • 【php常用公共函数】php获取指定时间段中有那几年并输出年份的起始时间和结束时间
  • 酱香经典——茅台镇的酱酒“四台”的传奇
  • 姚望篮坛数十秋 巨人肩头月满楼 新篇开启情难舍 篮球梦续望云头
  • Java避坑案例 - 线程池使用中的风险识别与应对
  • 数据分析常用模型:RFM模型、漏斗模型、AARRR模型
  • 肿瘤B细胞图谱的多维探索:三篇前沿研究详解与对比
  • Spring Boot,Mybatis Plu连接 Sql Server 数据库源(根据 sql server 自动生成代码结构),解决报错
  • Scikit-learn和Keras简介
  • Redis面试总结(一)
  • springcloud整合sentinel,限流策略持久化到nacos,详细配置案例
  • MySQL—基础学习