目录

QThread

官方解析

博主栗子

子线程发射信号给主线程


QThread

官方解析

Detailed Description

QThread类提供了跨平台的线程管理的API。
QThread对象在程序中管理一个线程。 使用run()来执行,默认情况下run()通过调用exec()实现事件循环,并且run()使得QThread的对象的线程中Qt的事件循环跑起来。
可以用QObject::moveToThread()使worker对象放入线程中。

  class Worker : public QObject{Q_OBJECTpublic slots:void doWork(const QString &parameter) {QString result;/* ... here is the expensive or blocking operation ... */emit resultReady(result);}signals:void resultReady(const QString &result);};class Controller : public QObject{Q_OBJECTQThread workerThread;public:Controller() {Worker *worker = new Worker;worker->moveToThread(&workerThread);connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);connect(this, &Controller::operate, worker, &Worker::doWork);connect(worker, &Worker::resultReady, this, &Controller::handleResults);workerThread.start();}~Controller() {workerThread.quit();workerThread.wait();}public slots:void handleResults(const QString &);signals:void operate(const QString &);};

在这个代码里面Worker的槽函数在另外一个线程中执行。但可以使用信号与槽让任意的object对象(继承了QObject,并且带有Q_OBJECT宏)信号连接Worker的槽函数。这种跨线程的信号与槽的连接方式是安全的,这得归功于connect()函数的第五个参数(参考链接)默认调用了queued connections。
另外一种方式让代码运行在其他线程的方式是,子类化QThread类,并且重新实现run()函数,栗子如下:

  class WorkerThread : public QThread{Q_OBJECTvoid run() Q_DECL_OVERRIDE {QString result;/* ... here is the expensive or blocking operation ... */emit resultReady(result);}signals:void resultReady(const QString &s);};void MyObject::startWorkInAThread(){WorkerThread *workerThread = new WorkerThread(this);connect(workerThread, &WorkerThread::resultReady, this, &MyObject::handleResults);connect(workerThread, &WorkerThread::finished, workerThread, &QObject::deleteLater);workerThread->start();}

在这个栗子中,thread将会在函数返回的时候退出。他们将不会在线程中运算事件循环,除非他们调用exec().
要注意QThread实例存在与谁实例化他的线程中,而不是在谁调用了run()这个函数的线程中。这就意味着QThread以队列连接的信号与槽,将会执行在实例化他的线程中,而不是调用run()函数这个线程中。因此如果希望在新线程里面调用槽函数得使用worker对象显示出的方式;不应该将槽函数直接实例在子类化的QThread中。
当子类化QThread类后,构造函数会旧的(实例化他的)那个线程中执行,而run()的执行将会在新线程中。如果这两个函数都访问了成员变量,从两个不同的线程中访问这个变量,要检测这么做是否安全!

Note:要小心,在不同对象或者线程中交互。查看Synchronizing Threads查看详情!

博主栗子

子线程发射信号给主线程

当子线程里面emit一个signal给主线程,这是十分常见的,但主线程emit一个signal给子线程那么会发送些什么呢!

运行截图如下:

源码瑞星啊:

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>class QThread;
class Worker;class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = 0);~Widget();protected:void timerEvent(QTimerEvent *event)Q_DECL_OVERRIDE;signals:void hello();void sendMsg();private:QThread *thread[3];Worker *worker[3];
};#endif // WIDGET_H

worker.h

#ifndef WORKER_H
#define WORKER_H#include <QObject>class Worker : public QObject
{Q_OBJECT
public:Worker(QObject *parent = 0);public slots:void beginToWork();void mainThreadMsg();
};#endif // WORKER_H

main.cpp

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

widget.cpp

#include "widget.h"
#include "worker.h"
#include <QDebug>
#include <QThread>
Widget::Widget(QWidget *parent): QWidget(parent)
{for(int i=0;i<3;i++){thread[i]=new QThread;worker[i]=new Worker;worker[i]->moveToThread(thread[i]);connect(thread[i],&QThread::finished,worker[i],&QObject::deleteLater);connect(this,&Widget::hello,worker[i],&Worker::beginToWork);connect(this,SIGNAL(sendMsg()),worker[i],SLOT(mainThreadMsg()),Qt::DirectConnection);thread[i]->start();}emit hello();startTimer(1000);}Widget::~Widget()
{for(int i=0;i<3;i++){thread[i]->quit();thread[i]->wait();delete thread[i];delete worker[i];}
}void Widget::timerEvent(QTimerEvent *event)
{Q_UNUSED(event)emit sendMsg();//    for(int i=0;i<3;i++){
//        qDebug()<<"main thread, worker "<<i;
//        worker[i]->mainThreadMsg();
//    }
}

worker.cpp

#include "worker.h"
#include <QDebug>
#include <QThread>Worker::Worker(QObject *parent) : QObject(parent)
{}void Worker::beginToWork()
{while(true){QThread::sleep(2);qDebug()<<QThread::currentThreadId()<<" beginToWork";mainThreadMsg();}
}void Worker::mainThreadMsg()
{qDebug()<<"mainThreadMsg called!"<<QThread::currentThreadId();
}

Qt文档阅读笔记-Qt工作笔记-QThread解析与实例(主线程发送信号给子线程)相关推荐

  1. Qt文档阅读笔记-共享库的创建与调用

    使用共享库的符号 这个符号可以作用在变量.类.函数中,并且这些都可以被调用端使用. 在编译共享库中,需要使用export符号.在使用端调用的时候使用import符号. 这里是本人从文档中记录的笔记,大 ...

  2. Qt文档阅读笔记-加载HeightMap(高度图)构造3D地形图

    Qt文档阅读笔记-加载HeightMap(高度图)构造3D地形图 QHeightMapSurfaceDataProxy:是Q3DSurface的一个基本代理类. 他是专门加载高度图. 高度图是没有X, ...

  3. Qt文档阅读笔记-Rotations Example相关

    Rotations Example文档阅读笔记 使用这种方式,对y轴和z轴进行旋转. QQuaternion yRotation = QQuaternion::fromAxisAndAngle(0.0 ...

  4. Qt文档阅读笔记-Q_ASSERT的另外一总用法(大佬用法)

    刚刚看到文档里面有个Q_ASSERT,好玩的用法! 普通人的用法如下: #include <QApplication> #include <QGraphicsLineItem> ...

  5. 百度文库新一代文档阅读器,核心技术点全解析

    导读:文库有数十亿文档,包括 word.ppt.excel.txt 和 pdf 等十几种常见办公文档,核心技术是转码和展现,转码的目的是把不同文档进行解析转换成一套通用的数据格式,由后端实现,而展现是 ...

  6. Qt文档阅读笔记-QThread::setPriority(Priority priority)官方解析及实例

    目录 官方解析 博主栗子 官方解析 QThread::setPriority(Priority priority) 这个函数为运行的线程设置了优先级.如果这个线程没有运行,那么这么函数啥事都不会做,并 ...

  7. Qt文档阅读笔记-moc工具使用及其理论(moc工具如何添加到makefile中)

    moc(Meta-Object Compiler):用于处理Qt中关于C++的扩展. moc工具读取C++头文件,看看这个头文件里面的类是不是包含Q_OBJECT宏,它会将这个头文件,转换为带有met ...

  8. Qt文档阅读笔记-Fortune Client Example实例解析

    目录 官方解析 实例代码 博主增加解析 官方解析 Fortune Client Example 以使用QTcpSocket为例子,服务端可以配合Fortune Server或Threaded Fort ...

  9. Qt文档阅读笔记-对Style Plugin Example实例的解析

    目录 前言 Style Plugin Example SimpleStylePlugin Class 定义 SimpleStylePlugin Class 实现 main()函数 The Simple ...

最新文章

  1. GitHub开源游戏:CityBound(模拟城市)
  2. 技能树升级——Chrome Headless模式 - 全栈客栈 - SegmentFault
  3. 「机器学习」彻底搞懂CNN
  4. 青少年计算机学奥林匹克大赛,2019年第36届全国青少年信息学奥林匹克竞赛获奖规则...
  5. 当你装不上Python外部包时,试试这个网站
  6. RHEL4-VNC服务配置
  7. 2011年 11月底-12月初 51Aspx源码发布详情
  8. 用户登陆python脚本
  9. 最新Linux之Nacos高可用集群配置
  10. Win8.1 JAVA环境配置全过程
  11. oracle如何储存超长汉子_热水器该如何选择?!
  12. NextArch Foundation 下一代架构基金会
  13. php怎么将农历转换成公历,农历公历转换器,公历农历转换
  14. #444 沸腾客厅:在播客里温暖一个冬天
  15. 服务器2008系统镜像,云服务器2008r2镜像
  16. 华为服务器ip从bios哪里修改,服务器bios设置ip
  17. 【NA】拉格朗日插值法
  18. http实现大文件上传
  19. 小勇机器人如何绑定_小勇机器人app
  20. 浙江台州3名乡村教师谈育人:教育源于爱

热门文章

  1. 老板要做数字化转型,干了3个月的脏活累活,我被开除了
  2. 给你人生的启迪飞鸽传书
  3. 【转载】浅谈 看图软件 的设计与实现
  4. 每人都有两大炸弹的扎金花2012
  5. 『飞秋』在ASP.NET服务器端过程中使用WebBrowser的注意事项
  6. 一个比较简单驱动程序[编译环境]
  7. 程序员美团面试挂了,7天后去腾讯面试,见到面试官:好巧啊!!
  8. python3 新式类_python新式类和旧式类区别
  9. vba代码编程800例_VBA编程常用过程代码实例2630
  10. 重磅!这个生信神器助你文章秒出图——miRNA与基因互作数据库