千家信息网

Qt5.9如何继承QObject创建多线程

发表于:2024-11-26 作者:千家信息网编辑
千家信息网最后更新 2024年11月26日,本篇文章给大家分享的是有关Qt5.9如何继承QObject创建多线程,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。利用继承QObject
千家信息网最后更新 2024年11月26日Qt5.9如何继承QObject创建多线程

本篇文章给大家分享的是有关Qt5.9如何继承QObject创建多线程,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

利用继承QObject方法创建多线程,主要的步骤有一下几点:(注意:退出线程循环后,还要调用QThread::quit()函数,该线程才会触发QThread::finished()信号)

a1:首先创建一个类MyThread,基类为QObject。

a2:在类MyThread中创建一个槽函数,用于运行多线程里面的代码。所有耗时代码,全部在这个槽函数里面运行。

a3:实例一个QThread线程对象(容器),将类MyThread的实例对象转到该容器中,用函数void QObject::moveToThread(QThread *thread);

myObjectThread->moveToThread(firstThread);

a4:用一个信号触发该多线程槽函数,比如用QThread::started()信号。

connect(firstThread,SIGNAL(started()),myObjectThread,SLOT(startThreadSlot()));

a5:用信号QThread::finished绑定槽函数QThread::deleteLatater(),在线程退出时,销毁该线程和相关资源。

connect(firstThread,SIGNAL(finished()),firstThread,SLOT(deleteLater()));

a6:所有线程初始化完成后,启动函数QThread::start()开启多线程,然后自动触发多线程启动信号QThread::started()。

具体的教程如下图所示:

1.1新建一个widget工程,不要勾选ui界面。然后分别在mythread.h,mythread.cpp,widget.h,widget.cpp,main.cpp分别添加如下代码。

mythread.h

#ifndef MYTHREAD_H#define MYTHREAD_H #include  class MyThread : public QObject{    Q_OBJECTpublic:    explicit MyThread(QObject *parent = nullptr);     void closeThread(); signals: public slots:    void startThreadSlot(); private:    volatile bool isStop;}; #endif // MYTHREAD_H

mythread.cpp

#include "mythread.h"#include #include  MyThread::MyThread(QObject *parent) : QObject(parent){    isStop = false;} void MyThread::closeThread(){    isStop = true;} void MyThread::startThreadSlot(){    while (1)    {        if(isStop)            return;        qDebug()<<"MyThread::startThreadSlot QThread::currentThreadId()=="<

widget.h

#ifndef WIDGET_H#define WIDGET_H #include #include #include #include #include "mythread.h" class Widget : public QWidget{    Q_OBJECT public:    Widget(QWidget *parent = 0);    ~Widget();     void createView(); private slots:    void openThreadSlot();    void closeThreadSlot();    void finishedThreadSlot(); private:    QVBoxLayout *mainLayout;    QThread *firstThread;    MyThread *myObjectThread;}; #endif // WIDGET_H

widget.cpp

#include #include "widget.h" Widget::Widget(QWidget *parent)    : QWidget(parent){    createView();} Widget::~Widget(){} void Widget::createView(){    /*UI界面*/    mainLayout = new QVBoxLayout(this);    QPushButton *openThreadBtn = new QPushButton(tr("打开线程"));    QPushButton *closeThreadBtn = new QPushButton(tr("关闭线程"));    mainLayout->addWidget(openThreadBtn);    mainLayout->addWidget(closeThreadBtn);    mainLayout->addStretch();    connect(openThreadBtn,SIGNAL(clicked(bool)),this,SLOT(openThreadSlot()));    connect(closeThreadBtn,SIGNAL(clicked(bool)),this,SLOT(closeThreadSlot()));} void Widget::openThreadSlot(){    /*开启一条多线程*/    qDebug()<moveToThread(firstThread);                                      //将创建的对象移到线程容器中    connect(firstThread,SIGNAL(finished()),myObjectThread,SLOT(deleteLater()));        //终止线程时要调用deleteLater槽函数    connect(firstThread,SIGNAL(started()),myObjectThread,SLOT(startThreadSlot()));  //开启线程槽函数    connect(firstThread,SIGNAL(finished()),this,SLOT(finishedThreadSlot()));    firstThread->start();                                                           //开启多线程槽函数    qDebug()<<"mainWidget QThread::currentThreadId()=="<isRunning())    {        myObjectThread->closeThread();  //关闭线程槽函数        firstThread->quit();            //退出事件循环        firstThread->wait();            //释放线程槽函数资源    }} void Widget::finishedThreadSlot(){    qDebug()<

main.cpp

#include "widget.h"#include  int main(int argc, char *argv[]){    QApplication a(argc, argv);    Widget w;    w.resize(960,640);    w.show();     return a.exec();}

1.2程序构建和运行后,结果如下图所示:

开启多线程

关闭多线程

以上就是Qt5.9如何继承QObject创建多线程,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

线程 函数 信号 代码 容器 对象 运行 实例 更多 界面 知识 篇文章 资源 循环 实用 事件 就是 工作会 工程 教程 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 朝阳软件开发报价 简极网络技术有限公司 太湖软件开发技术项目实训中心 金华公司网络安全准入控制报价 河北华为服务器维修价格 大连软件开发培训多少钱 枪火重生服务器连接超时 表格和数据库 网络安全常用词汇 跑跑手机版登录服务器超时 永结无间链接服务器失败 软件开发转运维理由 网络安全行业上游企业 数据库范式bcnf 海宁软件开发有限公司 tcp服务器连接数限制 南川区一站式软件开发流程代理商 服务器如何运行 电脑总弹出服务器正在运行 服务器管理ip分配 车况检测软件开发 简述网络安全设计原则有哪些 黄冈专业的软件开发团队 计算机网络技术的岗位情况 剑网三怀旧服有哪些服务器 答辩运用了哪些网络安全防护技术 不做网络安全等级保护测评坏处 闲鱼老是说我网络安全 数据库设置数据有效时间 中北大学网络安全专业宋老师
0