QT创建线程

1、使用Worker + moveToThread的方式将任务移动到线程实例对象中。

(1)创建循环子线程

cpp 复制代码
#ifndef WORKER_H
#define WORKER_H
#include <QObject>
#include <chrono>
#include <QThread>
#include <QDebug>
class Worker:public QObject
{
    Q_OBJECT
public:
    explicit Worker(QObject* parent = nullptr);
public slots:
    void doWork();
signals:
    void workFinished();
};
#endif
#include "Worker.h"
Worker::Worker(QObject* parent):QObject(parent)
{

}
void Worker::doWork()
{
    int a = 0;
    qDebug()<< "子线程ID:" << QThread::currentThreadId();
    while(1)
    {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        qDebug() << a++;
        if(a > 10)
            break;
    }
    //任务完成,退出
    emit workFinished();
}
#include <QCoreApplication>
#include <QThread>
#include <QTimer>
#include <QDebug>
#include "Worker.h"
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    //获取主线程id
    qDebug() << "主线程ID:" <<QThread::currentThreadId();
    //创建线程实例
    QThread* taskThread = new QThread();
    //创建任务对象
    Worker* worker = new Worker();

    //将任务对象worker移动到线程实例中
    worker->moveToThread(taskThread);

    QObject::connect(taskThread,&QThread::started,worker,&Worker::doWork);//任务开始
    QObject::connect(worker,&Worker::workFinished,taskThread,&QThread::quit);//退出线程
    QObject::connect(taskThread,&QThread::finished,taskThread,&QThread::deleteLater);//清理线程对象
    QObject::connect(taskThread,&QThread::finished,worker,&QThread::deleteLater);//清理任务对象
    //启动子线程
    taskThread->start();
    return a.exec();
}

(2)创建非循环子线程,在子线程中使用定时器。

cpp 复制代码
#ifndef WORKER_H
#define WORKER_H
#include <QObject>
#include <chrono>
#include <QThread>
#include <QDebug>
#include <QTimer>
class Worker:public QObject
{
    Q_OBJECT
public:
    explicit Worker(QObject* parent = nullptr);
public slots:
    void doLoopWork();
    void startTimer();//在子线程中启动定时器
private slots:
    void doTimerWork();
signals:
    void workFinished();
private:
    QTimer* timer = nullptr;
};
#endif
#include "Worker.h"
Worker::Worker(QObject* parent):QObject(parent)
{

}
void Worker::doLoopWork()
{
    int a = 0;
    qDebug()<< "子线程ID:" << QThread::currentThreadId();
    while(1)
    {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        qDebug() << a++;
        if(a > 10)
            break;
    }
    //任务完成,退出
    emit workFinished();
}
void Worker::startTimer()
{
    qDebug() << "启动定时器,线程ID:" << QThread::currentThreadId();
    timer = new QTimer(this);
    timer->setInterval(1000);
    QObject::connect(timer,&QTimer::timeout,this,&Worker::doTimerWork);
    timer->start();
}
void Worker::doTimerWork()
{
    static int a = 0;
    qDebug() << ++a;
    if(a > 10)
    {
        if(timer)
        {
            timer->stop();
        }
    }
}
#include <QCoreApplication>
#include <QThread>
#include <QTimer>
#include <QDebug>
#include "Worker.h"
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    //获取主线程id
    qDebug() << "主线程ID:" <<QThread::currentThreadId();
    //创建线程实例
    QThread* taskThread = new QThread();
    //创建任务对象
    Worker* worker = new Worker();

    //将任务对象worker移动到线程实例中
    worker->moveToThread(taskThread);

    QObject::connect(taskThread,&QThread::started,worker,&Worker::startTimer);//任务开始
    QObject::connect(worker,&Worker::workFinished,taskThread,&QThread::quit);//退出线程
    QObject::connect(taskThread,&QThread::finished,taskThread,&QThread::deleteLater);//清理线程对象
    QObject::connect(taskThread,&QThread::finished,worker,&QThread::deleteLater);//清理任务对象
    //启动子线程
    taskThread->start();
    return a.exec();
}
相关推荐
nice_lcj52041 分钟前
ThreadLocal 入门:它是怎么隔离数据的、为什么会导致内存泄漏
java·开发语言·后端·面试·并发编程·内存泄漏·threadlocal
紧跟先前的步伐1 小时前
Go AI Agent 实战 28|Agent 的预算、超时与停止条件
开发语言·人工智能·后端·ai·golang
bksczm2 小时前
InnoDB 行格式详解:DYNAMIC / COMPACT / COMPRESSED / REDUNDANT
java·开发语言·数据库
春涧草茶2 小时前
慢就是快16-1协程
开发语言·前端·python
Dovis(誓平步青云)3 小时前
启元 T1 Pro 人机相声搭档:语音-触摸双通道的启元机器人节奏引擎设计
开发语言·前端·javascript·microsoft·交互
做科研的周师兄3 小时前
【R语言实战】MixSIAR 氢氧同位素水源解析全流程:从混合空间校验到贝叶斯 MCMC 收敛诊断(后附完整代码)
java·大数据·开发语言
.痞老板.4 小时前
java ee--计算机是如何工作的
java·开发语言·java-ee
奇树谦4 小时前
Qt Quick 图片加载与 GPU 纹理机制详解:QImage、QQuickTextureFactory、QSGTexture 与异步加载
开发语言·qt·系统架构
青梅味猪大肠4 小时前
【操作系统-60】临近适应算法
java·linux·开发语言·嵌入式硬件·算法·操作系统
starzy19906 小时前
深入理解Scala可变Map:动态构建场景下的性能与设计权衡
开发语言·scala