当前位置: 首页 > news >正文

QT 线程之movetothread

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

这两种方法都少不了QThread类,前者继承于QThread类,后者复合QThread类。

本文以实例的方式描述了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;//复合了QThread类
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,把代码移到槽函数,用信号触发它就行了。

http://www.lryc.cn/news/337253.html

相关文章:

  • 如何处理ubuntu22.04LTS安装过程中出现“Daemons using outdated libraries”提示
  • 跟TED演讲学英文:The inside story of ChatGPT‘s astonishing potential by Greg Brockman
  • mybatis05:复杂查询:(多对一,一对多)
  • 微电网优化:基于肝癌算法(Liver Cancer algorithm, LCA)的微电网优化(提供MATLAB代码)
  • VUE_H5页面跳转第三方地图导航,兼容微信浏览器
  • 智慧安全运营:智能化运维,确保服务无忧
  • R-tree总结
  • Python 与机器学习,在服务器使用过程中,常用的 Linux 命令包括哪些?
  • js通过Object.defineProperty实现数据响应式
  • docker最简单教程(使用dockerfile构建环境)
  • Vue2 —— 学习(三)
  • Qt Creator 12.0.2 debug 无法查看变量的值 Expression too Complex
  • LeetCode-Java:303、304区域检索(前缀和)
  • 出海业务的网络安全挑战
  • 蓝桥杯考前准备— — c/c++
  • 【MATLAB源码-第4期】基于MATLAB的1024QAM误码率曲线,以及星座图展示。
  • 数据结构-----枚举、泛型进阶(通配符?)
  • 线上问题监控 Sentry 接入全过程
  • 【数据库(MySQL)基础】以MySQL为例的数据库基础
  • 权限修饰符,代码块,抽象类,接口.Java
  • CSS设置文本
  • 【svg】—— java提取svg中的颜色
  • 论文分享 | FAST'23 阿里云提出的针对SMR优化的存储引擎SMRSTORE
  • 题目:建造房屋 (蓝桥OJ3362)
  • 智能合约平台开发指南
  • 数学建模-最优包衣厚度终点判别法(主成分分析)
  • Mysql内存表及使用场景(12/16)
  • Django交易商场
  • 华为校园公开课走入上海交大,鸿蒙成为专业核心课程
  • 【会员单位】泰州玉安环境工程有限公司