QT ObjectThread moveToThread多线程操作

        QT多线程专栏共有15篇文章,从初识线程到、QMutex锁、QSemaphore信号量、Emit、Sgnals、Slot主线程子线程互相传值同步变量、QWaitCondition、事件循环、QObjects、线程安全、线程同步、线程异步、QThreadPool线程池、ObjectThread多线程操作、 moveToThread等线程操作进行了全面!深入!的研究和详细的说明

        本文实现了QObjectThread多线程的使用示例,新建了四个线程同时绑定了QTextEdit进行输出,moveToThread也有详细代码教程示例。

 本文作者原创,转载请附上文章出处与本文链接。

QT ObjectThread moveToThread多线程操作目录

1 新建界面

​编辑

2 mainwindow.h

3 mainwindow.cpp

4 WorkObject.h

5 WorkObject.cpp

6 moveToThread

6.1 效果

6.2 ObjectThread.h

6.3 ObjectThread.cpp

7 mainwindow.h

8 mainwindow.cpp

9 多线程的各种操作


1 新建界面

        新建四个QTextEdit控件两个按钮

2 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTimer>
#include <QThread>
#include <QCloseEvent>
#include "WorkObject.h"
#pragma execution_character_set("utf-8")

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    void editInsertText1(QString strText);
    void editInsertText2(QString strText);
    void editInsertText3(QString strText);
    void editInsertText4(QString strText);
private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::MainWindow *ui;

    WorkObject* m_workList[4];
    QThread m_thread[4];

    QString Title;
    QString Version;
    QString BlogText;
};
#endif // MAINWINDOW_H

3 mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    Title = "QT QObjectThread  CSDN 双子座断点 ";
    Version = "V 1.0 ";
    BlogText = "https://blog.csdn.net/qq_37529913?type=lately/";
    setWindowTitle(Title + Version + BlogText);

    m_workList[0]=new WorkObject(ui->textEdit);
    m_workList[1]=new WorkObject(ui->textEdit_2);
    m_workList[2]=new WorkObject(ui->textEdit_3);
    m_workList[3]=new WorkObject(ui->textEdit_4);

    m_workList[0]->moveToThread(&m_thread[0]);
    m_workList[1]->moveToThread(&m_thread[1]);
    m_workList[2]->moveToThread(&m_thread[2]);
    m_workList[3]->moveToThread(&m_thread[3]);

    connect(&m_thread[0],SIGNAL(started()),m_workList[0],SLOT(starWork()));
    connect(&m_thread[1],SIGNAL(started()),m_workList[1],SLOT(starWork()));
    connect(&m_thread[2],SIGNAL(started()),m_workList[2],SLOT(starWork()));
    connect(&m_thread[3],SIGNAL(started()),m_workList[3],SLOT(starWork()));

}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked()
{
    m_workList[0]->startThread();
    m_workList[1]->startThread();
    m_workList[2]->startThread();
    m_workList[3]->startThread();

    m_thread[0].start();
    m_thread[1].start();
    m_thread[2].start();
    m_thread[3].start();

}

void MainWindow::on_pushButton_2_clicked()
{

    m_workList[0]->stopThread();
    m_workList[1]->stopThread();
    m_workList[2]->stopThread();
    m_workList[3]->stopThread();

    QTimer::singleShot(1*1000,&m_thread[0],SLOT(terminate()));
    QTimer::singleShot(1*1000,&m_thread[1],SLOT(terminate()));
    QTimer::singleShot(1*1000,&m_thread[2],SLOT(terminate()));
    QTimer::singleShot(1*1000,&m_thread[3],SLOT(terminate()));

}

4 WorkObject.h

#ifndef WORKOBJECT_H
#define WORKOBJECT_H

#include <QObject>
#include <QTime>
#include <QDebug>
#include <QThread>
#include <QTextEdit>

#pragma execution_character_set("utf-8")

QT_BEGIN_NAMESPACE
class QListWidget;
QT_END_NAMESPACE


class WorkObject : public QObject
{
    Q_OBJECT
public:
    WorkObject(QTextEdit *listEdit,QObject *parent = 0);
    ~WorkObject();

    void stopThread();
    void startThread();
private:
  QTextEdit *m_listEdit;
  bool m_runStatus;

public slots:
  void starWork();//开始工作
};

#endif // WORKOBJECT_H


5 WorkObject.cpp

#include "WorkObject.h"

WorkObject::WorkObject(QTextEdit *listEdit, QObject *parent)
  : QObject(parent)
{
    m_listEdit=listEdit;
    m_runStatus=true;
}

WorkObject::~WorkObject()
{
}

void WorkObject::starWork()
{
    while (true)
    {
        if(!m_runStatus){
            break;
        }
        QString msg="ThreadId:" + QString::number((unsigned int)QThread::currentThreadId()) + " " + " Time:"+QTime::currentTime().toString("HH:mm:ss");
        m_listEdit->insertPlainText(msg + "\n");
        QThread::sleep(1);
    }
}

void WorkObject::stopThread()
{
    m_runStatus=false;
}

void WorkObject::startThread()
{
    m_runStatus=true;
}



//#include "WorkObject.h"

//WorkObject::WorkObject(QObject *parent)
//  : QObject(parent)
//{
//}

//WorkObject::~WorkObject()
//{
//  qDebug() << "WorkObject 销毁" << endl;
//}

//void WorkObject::objWork()
//{
//  for (int i = 0; i < 1000; ++i)
//  {
//    qDebug() << i << endl;
//  }
//  emit workFinished();
//}

//void WorkObject::starWork()
//{
//  emit workStart();
//  objWork();
//}

6 moveToThread

        以下附加核心代码、全部代码请参考最后。

6.1 效果

 

6.2 ObjectThread.h

#ifndef OBJECTTHREAD_H
#define OBJECTTHREAD_H

#include <QObject>
#include <QThread>
#include <QDebug>

#pragma execution_character_set("utf-8")

class ObjectThread : public QObject
{
    Q_OBJECT

public:
    ObjectThread(QObject *parent = nullptr);
    ~ObjectThread();

public:
    void stopThread();
    void startThread();

public slots:
    void slotStart();

private:
   bool m_runStatus;
};

#endif // OBJECTTHREAD_H

6.3 ObjectThread.cpp

#include "ObjectThread.h"
ObjectThread::ObjectThread(QObject *parent): QObject(parent)
{
    m_runStatus = false;
}
ObjectThread::~ObjectThread()
{

}

void ObjectThread::stopThread()
{
    m_runStatus=false;
}

void ObjectThread::startThread()
{
    m_runStatus=true;
}


void ObjectThread::slotStart()
{
    int i = 0;
    qDebug()<<"子线程 id"<<QThread::currentThreadId();
    while (true)
    {
        if(!m_runStatus){
            break;
        }
        qDebug()<<"线程自增:" + QString::number(++i);
        QThread::sleep(1);
    }

}

7 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTimer>
#include <QThread>
#include <QCloseEvent>
#include "WorkObject.h"
#include "ObjectThread.h"

#pragma execution_character_set("utf-8")

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    void editInsertText1(QString strText);
    void editInsertText2(QString strText);
    void editInsertText3(QString strText);
    void editInsertText4(QString strText);
private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();


private:
    Ui::MainWindow *ui;

    QThread thread;
    ObjectThread* object;

//    WorkObject* m_workList[4];
//    QThread m_thread[4];

    QString Title;
    QString Version;
    QString BlogText;
};
#endif // MAINWINDOW_H

8 mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    Title = "QT QObjectThread  CSDN 双子座断点 ";
    Version = "V 1.0 ";
    BlogText = "https://blog.csdn.net/qq_37529913?type=lately/";
    setWindowTitle(Title + Version + BlogText);


    object = new ObjectThread;

    object->moveToThread(&thread);

    connect(&thread,SIGNAL(started()),object,SLOT(slotStart()));


//    m_workList[0]=new WorkObject(ui->textEdit);
//    m_workList[1]=new WorkObject(ui->textEdit_2);
//    m_workList[2]=new WorkObject(ui->textEdit_3);
//    m_workList[3]=new WorkObject(ui->textEdit_4);

//    m_workList[0]->moveToThread(&m_thread[0]);
//    m_workList[1]->moveToThread(&m_thread[1]);
//    m_workList[2]->moveToThread(&m_thread[2]);
//    m_workList[3]->moveToThread(&m_thread[3]);

//    connect(&m_thread[0],SIGNAL(started()),m_workList[0],SLOT(starWork()));
//    connect(&m_thread[1],SIGNAL(started()),m_workList[1],SLOT(starWork()));
//    connect(&m_thread[2],SIGNAL(started()),m_workList[2],SLOT(starWork()));
//    connect(&m_thread[3],SIGNAL(started()),m_workList[3],SLOT(starWork()));



}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked()
{

    object->startThread();
    //object->slotStart();
    thread.start();



//    m_workList[0]->startThread();
//    m_workList[1]->startThread();
//    m_workList[2]->startThread();
//    m_workList[3]->startThread();

//    m_thread[0].start();
//    m_thread[1].start();
//    m_thread[2].start();
//    m_thread[3].start();

}

void MainWindow::on_pushButton_2_clicked()
{
    object->stopThread();
    thread.quit();
    thread.wait();

//    delete thread;
//    thread = NULL;

//    m_workList[0]->stopThread();
//    m_workList[1]->stopThread();
//    m_workList[2]->stopThread();
//    m_workList[3]->stopThread();

//    QTimer::singleShot(1*1000,&m_thread[0],SLOT(terminate()));
//    QTimer::singleShot(1*1000,&m_thread[1],SLOT(terminate()));
//    QTimer::singleShot(1*1000,&m_thread[2],SLOT(terminate()));
//    QTimer::singleShot(1*1000,&m_thread[3],SLOT(terminate()));

}

9 多线程的各种操作

以下文章均为作者原创文章,看完记得收藏、关注加👍

线程、进程、多线程、线程池一文看懂从此秒变大佬!:深入理解线程、进程、多线程、线程池_双子座断点的博客-CSDN博客

QT 初识线程(简单实现):https://blog.csdn.net/qq_37529913/article/details/110127940

QT QMutex使用详解:https://blog.csdn.net/qq_37529913/article/details/110187452

QT 线程之QSemaphore(深入理解):https://blog.csdn.net/qq_37529913/article/details/110187121

QT线程 Emit、Sgnals、Slot详细解释:https://blog.csdn.net/qq_37529913/article/details/110211435

QT 线程之QWaitCondition(深入理解):https://blog.csdn.net/qq_37529913/article/details/110212704

Qt 多线程之线程事件循环(深入理解):https://blog.csdn.net/qq_37529913/article/details/110229382

QT线程之QObjects(深入理解):https://blog.csdn.net/qq_37529913/article/details/110228837

QT线程之可重入与线程安全(深入理解):https://blog.csdn.net/qq_37529913/article/details/110224166

QT 主线程子线程互相传值:QT 主线程子线程互相传值_双子座断点的博客-CSDN博客_qt主线程给子线程传数据

QT线程同步与异步处理:QT线程同步与异步处理_双子座断点的博客-CSDN博客_qt异步线程

QT 多线程之线程池QThreadPool(深入理解):QT 多线程之线程池QThreadPool(深入理解)_双子座断点的博客-CSDN博客_qthreadpool

QT之浅拷贝、深拷贝、隐式共享(深度理解必看文章):https://blog.csdn.net/qq_37529913/article/details/110235596QT 隐式共享机制对STL样式迭代器的影响:https://blog.csdn.net/qq_37529913/article/details/110252454
 

深入理解线程、进程、多线程、线程池_线程和进程和线程池_双子座断点的博客-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 打卡day46-- 单词拆分和多重背包问题

一个人的朝圣 — LeetCode打卡第46天 知识总结 Leetcode 139. 单词拆分题目说明代码说明 知识总结 今天写了一道题目, 但是还挺难的, 而且是面试高频题目 还过了一遍多重背包问题. 多重背包与01背包的区别在于多重背包限制了物品的个数, 某些物品的个数可能不为1, 可以使用两…

c++day3

#include <iostream> using namespace std;class Person { private:int age;int *p; public://无参构造Person():p(new int(89)){age 18;cout << "无参构造函数" <<endl;}//有参构造Person(int age,int num){this->age age;this->pnew int…

【Docker】Docker中 AUFS、BTRFS、ZFS、存储池概念的详细讲解

前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 &#x1f4d5;作者简介&#xff1a;热…

基于SpringCloud微服务毕业论文管理系统设计与实现

一、概述 1.1 课题背景及意义 随着学校不断扩大和学生人数的猛增,关于各类教学信息也越来越多。毕业论文的管理也成为了不可避免的一道关卡,学生需要及时获取论文相关进度,学校的管理者要求能方便对论文进行处理。基于这些需求,开发一个实用的微服务管理系统,以满足双方…

GELU激活函数

GELU是一种常见的激活函数&#xff0c;全称为“Gaussian Error Linear Unit”&#xff0c;其图像与ReLU、ELU对比如下&#xff1a; 文章链接&#xff1a;https://arxiv.org/pdf/1606.08415.pdf https://pytorch.org/docs/master/generated/torch.nn.GELU.html 公式为&#xff1…

Spring Cloud - HTTP 客户端 Feign 、自定义配置、优化、最佳实践

目录 一、Feign 是什么&#xff0c;有什么用呢&#xff1f; 二、Feign 客户端的使用 2.1、远程调用 1.引入依赖 2.在order-service&#xff08;发起远程调用的微服务&#xff09;的启动类添加注解开启Feign的功能 3.编写 Feign 客户端 4.通过 Feign 客户端发起远程调用 …

flutter 简介 flutter 能为我们做什么

flutter 简介 flutter 能为我们做什么 前言一、什么是Flutter&#xff1f;二、Flutter的特点和优势三、Flutter与其他跨平台框架的比较总结 前言 陆陆续续已经写了60多篇的flutter 的文章了&#xff0c;本篇文章就来说说我对flutter 的简单看法 一、什么是Flutter&#xff1f…

excel相关操作

文章目录 1、数据分列与绘图1.1、杂乱的数据拷贝到excel1.2、 智能分列1.2 或者手动设置分列1.3、杂论的符号替换掉1.4、对时间再次只能分裂1.5、绘图 1、数据分列与绘图 1.1、杂乱的数据拷贝到excel 1.2、 智能分列 选择数据&#xff0c;数据–>分列–> 智能分列 结…

速成!|量子粒子群优化算法及其实现(Matlab)

作者在前面的两篇文章中介绍了标准粒子群及其变体&#xff0c;**由于PSO算法需要设定的参数(惯性因子w&#xff0c;学习因子 c1&#xff0c;c2)太多&#xff0c;不利于找到待优化模型的最优参数&#xff0c;而且粒子位置变化缺少随机性&#xff0c;容易陷入局部最优。**针对这些…

UNet Pytorch实现

用于图像分割的不同种类的Unet模型的实现 UNet - U-Net&#xff1a; 用于生物医学图像分割的卷积网络 https://arxiv.org/abs/1505.04597RCNN-UNet - 基于U-Net的递归残差卷积神经网络&#xff08;R2U-Net&#xff09;用于医学图像分割 https://arxiv.org/abs/1802.06955Atten…

第八十五天学习记录:C++核心:内存分区模型

内存分区模型 C程序在执行时&#xff0c;将内存大方向划分为4个区域 1、代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理 2、全局区&#xff1a;存放全局变量和静态变量以及常量 3、栈区&#xff1a;由编译器自动分配释放&#xff0c;存放函数的参数…

5.8.2 TCP报文段首部格式

5.8.2 TCP报文段首部格式 TCP报文段首部格式在很大程度上体现了TCP协议的功能 一、数据封装过程 如图 应用层报文传送到传输层之后&#xff0c;加上TCP报文段的首部构成了TCP数据传送单位&#xff0c;我们称之为TCP报文段。在发送时TCP报文段是作为IP数据报的数据部分&#…

阿里巴巴开源Chat2DB v1.0.11 初体验

阿里巴巴开源Chat2DB v1.0.11 初体验 前言什么是Chat2DB下载安装安装配置Chat2DB初体验配置数据源准备测试数据认识几个功能菜单开始测试自然语言转SQLSQL解释SQL优化 使用总结后续功能结语 前言 作为一名阿里巴巴开源项目的拥护者&#xff0c;从Chat2DB开源至今都有关注这个开…

大型汽车制造业S4/HANA升级选择性数据迁移案例实践

自2015年正式发布以来&#xff0c;SAP S/4HANA已经成为全球数万家客户的共同选择。作为目前最主流的SAP ERP管理解决方案&#xff0c;支持企业革新业务流程&#xff0c;推动数字化转型进程。 S/4HANA升级技术路径如何选择&#xff1f; 全新实施or全量数据转换or选择性数据迁移…

【爬虫】对某某贴吧主页的爬虫分析+源码

1. 网站分析 想要的内容有标题、时间和帖子跳转链接 查看网站源代码&#xff0c;发现想要的内容就在里面&#xff0c;那就好办了&#xff0c;直接上正则&#xff0c;当然beautifulsoup也不是不可以 2. Python源码 import requests import re from prettytable import PrettyTa…

【Servlet学习三】实现一个内存版本的简易计算器~

目录 一、方式1&#xff1a;使用form表单的形式&#xff08;不推荐&#xff09; &#x1f308;1、前端代码&#xff1a;HTML文件 &#x1f308;2、后端代码&#xff1a;Calculator_form.java文件 &#x1f308;3、最终效果 二、方式2&#xff1a;使用ajax形式&#xff08;…

如何确保大模型追求“正确”的目标?丨AI安全与对齐圆桌回顾

导读 在智源大会「AI 安全与对齐」论坛上&#xff0c;与会嘉宾针对目前人们关心的 AI 安全控制标准、多智能体强化学习环境下的安全、开源对 AI 安全的影响、对智能涌现安全的思考等问题展开了讨论。 能力越大&#xff0c;责任越大。 嘉宾名单 谢旻希丨主持人&#xff0c;安远A…

【P61】JMeter JDBC Connection Configuration

文章目录 一、JDBC Connection Configuration 参数说明二、准备工作 一、JDBC Connection Configuration 参数说明 可以给数据源配置不同的连接池&#xff0c;供后续 JDBC 采样器使用&#xff1b;使用前请将对应的数据库驱动复制到 $JMETER_HOME/lib/ 或者 $JMETER_HOME/lible…

【剧前爆米花--爪哇岛寻宝】TCP实现可靠性的方法以及连接相关的三次握手四次挥手

作者&#xff1a;困了电视剧 专栏&#xff1a;《JavaEE初阶》 文章分布&#xff1a;这是一篇关于网络编程的文章&#xff0c;在这篇文章中我会具体介绍TCP是如何实现可靠性的并且分析建立断开连接的情况&#xff0c;希望对你有所帮助&#xff01; 目录 可靠性 确认应答 超时…

leecode-下一排列

题目 题目 分析 妈呀&#xff0c;其实我直接调用函数&#xff0c;一行代码就通过了hhh&#xff0c;不过这种取巧的方式不可取&#xff0c;还是得老老实实的写。 首先需要明白什么叫下一排列&#xff1f; 比如输入&#xff1a; 1 5 8 4 7 6 5 3 1 答案就是&#xff1a; 1 5 …