首页 > 其他分享 >QT:QThread 使用案例

QT:QThread 使用案例

时间:2024-10-30 21:47:06浏览次数:8  
标签:task QT thread 案例 线程 startadd include MainWindow QThread

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

解决:使用QThread

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

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

#ifndef TASK_H
#define TASK_H

#include <QThread>
#include <QObject>
class task: public QObject
{
    Q_OBJECT

public:
    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_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    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()

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

标签:task,QT,thread,案例,线程,startadd,include,MainWindow,QThread
From: https://blog.csdn.net/m0_51650696/article/details/143374642

相关文章

  • CesiumJS 案例 P12:添加指定长宽的图片图层并居中显示(圆点分别为图片图层的中心点、左
    CesiumJSCesiumJSAPI:https://cesium.com/learn/cesiumjs/ref-doc/index.htmlCesiumJS是一个开源的JavaScript库,它用于在网页中创建和控制3D地球仪(地图)一、添加加指定长宽的图片图层并居中显示(原点为图片图层的中心点)<!DOCTYPEhtml><htmllang="en"> <head>......
  • SpringBoot安卓开发的水果商城app (案例分析)-附源码
    摘  要在移动互联网的快速发展背景下,手机应用已成为人们生活中不可或缺的一部分。水果商城App作为电商领域的重要应用之一,为用户提供便捷的购物体验和丰富的商品选择。本研究旨在基于Android平台开发水果商城App,结合SpringBoot框架和Mysql数据库,以实现功能强大、操作简......
  • 手把手搭建自己私有的MQTT服务器,完成设备上云
    手把手搭建自己私有的MQTT服务器,完成设备上云原创ds小龙哥DS小龙哥嵌入式技术资讯 2024年09月19日13:21重庆5人听过一、前言在众多物联网通信协议中,MQTT(MessageQueuingTelemetryTransport)因其轻量、高效的特点而被广泛应用于各种物联网场景。它不仅能够满足设备低功......
  • WPF+MVVM案例实战(十二)- 3D数字翻牌计时实现
    文章目录1、运行效果2、功能实现1、文件创建2、控件代码实现3、控件引用与菜单实现1.引用用户控件2.按钮菜单1、运行效果2、功能实现1、文件创建打开项目Wpf_Examples,在用户控件UserControlLib中创建NumberFoldingCard.xaml文件,在主程序......
  • qt的c++环境配置和c++基础【正点原子】嵌入式Qt5 C++开发视频
    QTc++环境配置和c++基础c++环境配置和工程创建  1.配置步骤  2.新建qt工程目录和工程  3.重启qt后打开最近的qt项目c++基础-类和对象  1.什么是类和对象    A.类的定义    B.类的结构表示    C.类的访问权限    D.对象的定义    E.类和......
  • vue2基础组件通信案例练习:把案例Todo-list改写成本地缓存
    @目录概述前端代码本人其他相关文章链接概述前面文章案例已经练习了父子组件之间的通信,这一节讲述如何把todos数组放进本地缓存中,因为实际开发场景中频繁查询的数据很有可能会用到本地缓存技术。思考:如何改成使用本地缓存,是写一堆按钮每次触发就是往本地缓存种get和set?答案......
  • vue表单案例练习:vue表单创建一行数据及删除数据的实现与理解
    如何使用Vue:基本结构:1、引入Vue的核心JS文件2、准备Dom结构3、实例化组件通过el属性,挂载元素,绑定id为app的html元素通过data属性,定义数据,可以在html代码段中显示的数据4、获取数据数据绑定最常见的形式就是使用“Mustache”语法(双大括号)的文本插值@目录目标两个例......
  • XSS案例分析和规避
    1.什么是XSS跨站脚本(XSS)是一种安全漏洞,允许攻击者向网站注入恶意客户端代码。该代码由受害者执行从而让攻击者绕过访问控制并冒充用户。XSS可能导致cookie、token等用户敏感信息被窃取,或者HTML被重写。下面是一个极简易的新闻发布功能的案例,前端获取用户输入的标题和新闻内容,服......
  • 【Python入门】7天速成Python桌面应用开发高手,WxPython vs PyQt:谁更胜一筹?
    ......
  • QT creator中cmake管理项目,如何引入外部库(引入Eigen库为例)
    在Eigen的官网下载压缩包[点我进入]解压到当前项目的根目录(当然你也可以自己选择目录)在当前项目的CMakeLists.txt任意位置加入这句话include_directories(${CMAKE_SOURCE_DIR}/eigen)这时候就是测试是否引入成功,在main.cpp中加入#include<Eigen/Dense>,鼠标悬停如果出现路......