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

摘要:
如下,直接上源代码,可以把费时的任务放到doWork()方法里进行,不阻塞主线程。1#ifndefWORKER_H2#defineWORKER_H34#include56classWorker:publicQObject7{8Q_OBJECT910public:11Worker();12~Worker();13publicslots:14voiddoWork();15private:1617};1819#endif//WORKERR_H1#include"Worker.h"2#include34Worker::Worker()5{67}89Worker::~Worker()10{1112}13voidWorker::doWork()14{15for16{17qDebug()˂moveToThread;同时在析构函数中,也要进行想要的资源释放,1disconnect;2disconnect;3if4{5if6{7m_pWorkerThread-˃quit();8m_pWorkerThread-˃wait();9}10deletem_pWorkerThread;11m_pWorkerThread=NULL;12}13if14{15deletem_pWorker;16m_pWorker=NULL;17}最后提一点,如果需要在doWork()函数传递参数中,涉及传递的参数是自定义的类型时,需要将其注册为元类型。如下的示例,1.我将需要计算的数据先进行预处理之后,发送我自定义的geoDataReady信号。1qRegisterMetaType˂std::vector˃;2//在线程中进行几何运算3m_pGeoWorker=newCMyWork;4connect;5connect;6connect;7m_pGeoWorker-˃moveToThread;8m_geoThread.start();

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

1 #ifndef WORKER_H
2 #define WORKER_H
3 
4 #include <QObject>
5 
6 class Worker : publicQObject
7 {
8 Q_OBJECT
9 
10 public:
11 Worker();
12     ~Worker();
13 publicslots:
14     voiddoWork();
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 voidWorker::doWork()
14 {
15     for (int i = 0;i < 10000;i++)
16 {
17         qDebug() <<i;
18 }
19 }

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

1 m_pWorker = newWorker;
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         deletem_pWorkerThread;
11         m_pWorkerThread =NULL;
12 }
13     if(m_pWorker)
14 {
15         deletem_pWorker;
16         m_pWorker =NULL;
17     }

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

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

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

1 qRegisterMetaType<std::vector<MyGeometry*>>("std::vector<MyGeometry* >");
2     //在线程中进行几何运算
3     m_pGeoWorker = newCMyWork;
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();

免责声明:文章转载自《Qt线程的简单使用(一)——通过QObject::moveToThread()创建线程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇c#模拟线性回归RobotFramework测试框架创建远程库Remote,并实现调用Ruby关键字接口下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Python多进程和多线程(跑满CPU)及IO模型详解

目录 Python多进程和多线程(跑满CPU)IO模型详解 Python多进程和多线程(跑满CPU) 转载自:https://www.liaoxuefeng.com/wiki/1016959663602400/1017627212385376 Python多进程和多线程(跑满CPU****) 概念 任务可以理解为进程(process),如打开一...

如何解决线程安全问题

转自:https://www.cnblogs.com/dolphin0520/p/3923737.html 虽然多线程编程极大地提高了效率,但是也会带来一定的隐患。比如说两个线程同时往一个数据库表中插入不重复的数据,就可能会导致数据库中插入了相同的数据。今天我们就来一起讨论下线程安全问题,以及Java中提供了什么机制来解决线程安全问题。   以下是本文的...

Android 4 学习(19):Services

参考《Professional Android 4 Development》   Services Service是invisible的,因此其优先级不高于visible的Activity,之所以说不高于,是因为我们可以设置Service为在前台运行。 创建Service Android提供了Service抽象类,继承它便可以创建一个Service类:  ...

C++面试

https://blog.csdn.net/weixin_44363885/article/details/99567746 这一行是个 贼鸡巴重要的链接!!!   很好的总结 我直接复制到下面了: 社招:社招的同学,无论是1-3年经验,还是中途转行,都可参考。写简历必须有针对性,以后台开发为例,请去拉勾网 / 猎聘 / 智联招聘等网站,多看看后台开发的J...

这几个IDEA高级调试技巧,用完就是香

一个项目启动两次 测试分布式项目时,经常要一个项目启动2次,不用将一个项目打开多次启动,配置一下即可 1.点击Edit Configurations 2.勾选Allow parallel run 3.依次点击如下2个按钮 条件断点 有如下代码,只想让它在i == 10的情况下停下来 @Test public void condition() {...

[转载]iOS 开发中为什么更新UI都要放在主线程中?

原因有2个: 1、在子线程中是不能进行UI 更新的,而可以更新的结果只是一个幻像:因为子线程代码执行完毕了,又自动进入到了主线程,执行了子线程中的UI更新的函数栈,这中间的时间非常的短,就让大家误以为分线程可以更新UI。如果子线程一直在运行,则子线程中的UI更新的函数栈 主线程无法获知,即无法更新 2、只有极少数的UI能,因为开辟线程时会获取当前环境,如点...