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();
}
相关推荐
小大宇39 分钟前
python sqlalchemy 案例
开发语言·python
名字还没想好☜1 小时前
Go 结构体内存对齐:调整字段顺序,同样的字段省下 40% 内存
开发语言·后端·golang·go·内存对齐
玛丽莲茼蒿1 小时前
很难出错的Spring5(十)—— IOC进阶
java·开发语言·jvm
Ulyanov1 小时前
雷达导引头仿真中的坐标系——从惯性系到量测角
开发语言·python·算法·系统仿真·雷达信号处理·雷达导引头
上海安当技术2 小时前
车间电脑指纹登录怎么做?从 FIDO2 公钥体系到统一身份认证的技术拆解
开发语言·电脑·php
前鼻音太阳熊2 小时前
【MES系统】- 工业HMI状态机可视化实践:从手写SVG到Cytoscape.js的技术选型与踩坑
开发语言·javascript·ecmascript
阿米亚波2 小时前
【C++ STL】std::array
java·开发语言·c++
wuyk5552 小时前
66.嵌入式C语言进阶:共用体(Union)实战指南——单片机内存省一半的神级技巧
c语言·开发语言·stm32·单片机·嵌入式硬件
Ivanqhz2 小时前
Rust #[derive(Serialize)]浅析
开发语言·后端·rust
怪奇云呼军2 小时前
闪电智能 Voice Agent 怎样根据语速、停顿和追问方式切换话术?策略引擎拆解
开发语言·人工智能·网络协议·算法·语音识别·web app