zoukankan      html  css  js  c++  java
  • 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();
    宣言:在此记录自己学习过程中的心得体会,同时积累经验,不断提高自己! 文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。 欢迎大家留言交流。转载请注明出处。
  • 相关阅读:
    yum安装LAMP
    CentOS7添加永久静态路由
    批量解压缩,显示进度条(2)
    Django静态文件配置
    大家同乐一下,搞了三天的字符串与STL!终于搞好了。。
    C++动态分配空间
    UNICODE问题
    VC编码规范 (转)
    vs2008中添加splash screen[分享]
    E
  • 原文地址:https://www.cnblogs.com/vegetable/p/6648609.html
Copyright © 2011-2022 走看看