• Qt线程的简单使用(一)——通过QObject::moveToThread()创建线程


    Qt中线程的一种创建方式,就是使用QObject::moveToThread()函数。如下,直接上源代码,可以把费时的任务放到doWork()方法里进行,不阻塞主线程。

     1 #ifndef WORKER_H
     2 #define WORKER_H
     3 
     4 #include <QObject>
     5 
     6 class Worker : public QObject
     7 {
     8     Q_OBJECT
     9 
    10 public:
    11     Worker();
    12     ~Worker();
    13 public slots:
    14     void doWork();
    15 private:
    16     
    17 };
    18 
    19 #endif // WORKERR_H
     1 #include "Worker.h"
     2 #include <QDebug>
     3 
     4 Worker::Worker()
     5 {
     6 
     7 }
     8 
     9 Worker::~Worker()
    10 {
    11 
    12 }
    13 void Worker::doWork()
    14 {
    15     for (int i = 0;i < 10000;i++)
    16     {
    17         qDebug() << i;
    18     }
    19 }

    需要在主程序中,关联相应的信号和槽,

    1 m_pWorker = new Worker;
    2     m_pWorkerThread = new QThread(this);
    3 
    4     connect(m_pWorkerThread, SIGNAL(started()),m_pWorker, SLOT(doWork()));
    5     connect(m_pWorkerThread, SIGNAL(finished()), m_pWorker, SLOT(deleteLater()));
    6     m_pWorker->moveToThread(m_pWorkerThread);

    同时在析构函数中,也要进行想要的资源释放,

     1 disconnect(m_pWorkerThread, SIGNAL(started()),m_pWorker, SLOT(doWork()));
     2     disconnect(m_pWorkerThread, SIGNAL(finished()), m_pWorker, SLOT(deleteLater()));
     3     if (m_pWorkerThread)
     4     {
     5         if (m_pWorkerThread->isRunning())
     6         {
     7             m_pWorkerThread->quit();
     8             m_pWorkerThread->wait();
     9         }
    10         delete m_pWorkerThread;
    11         m_pWorkerThread = NULL;
    12     }
    13     if (m_pWorker)
    14     {
    15         delete m_pWorker;
    16         m_pWorker = NULL;
    17     }

    最后提一点,如果需要在doWork()函数传递参数中,涉及传递的参数是自定义的类型时,需要将其注册为元类型。

    如下的示例,1.我将需要计算的数据先进行预处理之后,发送我自定义的geoDataReady信号。

    2.在线程中进行几何计算,完成之后,又将计算完成之后的数据发送回主函数。如下。

    1 qRegisterMetaType<std::vector<MyGeometry*>>("std::vector<MyGeometry* >");
    2     //在线程中进行几何运算
    3     m_pGeoWorker = new CMyWork;
    4     connect(this, SIGNAL(geoDataReady(const std::vector<MyGeometry> &)), m_pGeoWorker, SLOT(get(const std::vector<MYGeometry* > &)));
    5     connect(m_pGeoWorker, SIGNAL(geoResultCompleted(const std::vector<MYGeometry* > &)), this, SLOT(draw(const std::vector<MYGeometry* > &)));
    6     connect(&m_geoThread, SIGNAL(finished()), m_pGeoWorker, SLOT(deleteLater()));
    7     m_pGeoWorker->moveToThread(&m_geoThread);
    8     m_geoThread.start();
    宣言:在此记录自己学习过程中的心得体会,同时积累经验,不断提高自己! 文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。 欢迎大家留言交流。转载请注明出处。
  • 相关阅读:
    python操作MYSQL时防止SQL注入
    防止SQL注入的一些解决方法
    Gitbook 学习链接
    MySQL_编码utf8_bin和utf8_general_ci的区别
    使用linux脚本shell检查大数据各节点服务是否运行正常
    shell脚本监测elasticsearch集群节点
    Filebeat+Kafka+Logstash+ElasticSearch+Kibana搭建日志收集系统
    python中集合用法大全
    python常用内置函数
    跨模块全局变量的使用问题
  • 原文地址:https://www.cnblogs.com/vegetable/p/6648609.html
Copyright © 2020-2023  润新知