QT 线程之movetothread

上文列举了qt中线程的几种方法,其中2种方法最为常见。

本文以实例的方式描述了movetothread()这种线程的方法,将QObject的子类移动到指定的线程。

一、例子

1. Worker类

1.1Worker类头文件

#ifndef WORKER_H
#define WORKER_H
#include <QObject>
#include<QDebug>
#include <QThread>
class Worker : public QObject
{
    Q_OBJECT
public:
    explicit Worker(QObject *parent = nullptr);
public slots:

    void doWork(const QString &parameter);
signals:
    void resultReady(const QString &result);
};
#endif // WORKER_H
1.2 Worker类cpp文件

#include "worker.h"
Worker::Worker(QObject *parent)
    : QObject{parent}
{}
void Worker::doWork(const QString &parameter)
{
    // 在这里写入你的线程代码
    qDebug() << "Thread2 is running";
    qDebug() << parameter;//收到的参数
    //一个简单的循环
    for (int i = 0; i < 5; i++)
    {
        QThread::msleep(500); ; // 休眠1秒
        qDebug() << "!!!";
    }
    qDebug() << "end2";
    emit resultReady("======");//发结果
}

2.Controller类

2.1Controller类头文件

#ifndef CONTROLLER_H
#define CONTROLLER_H
#include <QObject>
#include "worker.h"
#include <QThread>
class Controller : public QObject
{
    Q_OBJECT
public:
    explicit Controller(QObject *parent = nullptr);
    QThread workerThread;
signals:
    void operate(const QString &parameter);
public slots:
    void handleResult(const QString & str);
};

#endif // CONTROLLER_H

2.2Controller类cpp文件

#include "controller.h"
Controller::Controller(QObject *parent)
    : QObject{parent}
{
    Worker *worker = new Worker;
    worker->moveToThread(&workerThread);
    connect(this, &Controller::operate, worker, &Worker::doWork);
    connect(worker, &Worker::resultReady, this,&Controller::handleResult);
    connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
    workerThread.start();

}
void Controller::handleResult(const QString & str)
{
    qDebug()<<str;//取结果
}
 

3.在窗口类的按钮函数里放入

void MainWindow::on_pushButton_xxx_clicked()//你自己的按钮函数
{
    Controller *controller = new Controller();
    controller->operate("parameter");
}

二、优缺点

优点:克服了重写run的缺点,比较灵活简洁,

缺点:但是不能在线程里面实现常驻任务(死循环的任务)。

轻量级的函数可以用movethread,无需创建独立线程类,例如你有多个小函数要在线程内做, 全部扔给一个QThread。还有一开始没使用线程,但是后边发觉这些代码还是放线程比较好,如果用子类化QThread的方法重新设计代码,将会有可能让你把这一段推到重来,这个时候,moveThread的好处就来了,你可以把这段代码的从属着movetothread,把代码移到槽函数,用信号触发它就行了。

相关推荐

  1. Qt-线2-moveToThread

    2024-04-07 06:00:05       38 阅读
  2. QT中使用moveToThread让任务在子线中进行

    2024-04-07 06:00:05       43 阅读
  3. Qt线QtConcurrent的介绍

    2024-04-07 06:00:05       40 阅读
  4. Qt线的使用

    2024-04-07 06:00:05       36 阅读
  5. Qt线编程(QThread)

    2024-04-07 06:00:05       27 阅读
  6. QT进阶】Qt线与并发线和并发的简单介绍

    2024-04-07 06:00:05       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-07 06:00:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-07 06:00:05       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-07 06:00:05       87 阅读
  4. Python语言-面向对象

    2024-04-07 06:00:05       96 阅读

热门阅读

  1. Redis过期删除策略和内存淘汰机制

    2024-04-07 06:00:05       45 阅读
  2. 前端node使用WebSocket实现实时通信例子

    2024-04-07 06:00:05       35 阅读
  3. Android ContentProvider基础知识学习笔记

    2024-04-07 06:00:05       39 阅读
  4. vue 生命周期

    2024-04-07 06:00:05       41 阅读
  5. [蓝桥杯 2023 国 B] 双子数

    2024-04-07 06:00:05       39 阅读
  6. ARXML处理 - C#的解析代码(一)

    2024-04-07 06:00:05       32 阅读
  7. Python常用算法--排序算法【附源码】

    2024-04-07 06:00:05       42 阅读
  8. 沐瞳科技一面 客户端开发(45min)

    2024-04-07 06:00:05       43 阅读
  9. CSS编写登录框样式

    2024-04-07 06:00:05       45 阅读