一点 信号和槽 nbsp debug 源代码 odata type raw
Qt 中线程的一种创建方式,就是使用 QObject::moveToThread() 函数。如下,直接上源代码,可以把费时的任务放到 doWork() 方法里进行,不阻塞主线程。
- 1 #ifndef WORKER_H
- 2 #defineWORKER_H 3
- 4#include
- 5
- 6 classWorker :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
- 3
- 4 Worker::Worker()
- 5 {
- 6
- 7 }
- 8
- 9Worker::~Worker()
- 10 {
- 11
- 12 }
- 13 void Worker::doWork()
- 14 {
- 15 for(inti =0;i <10000;i++)
- 16 {
- 17qDebug() << i;
- 18 }
- 19}
需要在主程序中,关联相应的信号和槽,
- 1m_pWorker =new Worker;
- 2m_pWorkerThread =newQThread(this);
- 3
- 4 connect(m_pWorkerThread, SIGNAL(started()),m_pWorker, SLOT(doWork()));
- 5 connect(m_pWorkerThread, SIGNAL(finished()), m_pWorker, SLOT(deleteLater()));
- 6m_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. 在线程中进行几何计算,完成之后,又将计算完成之后的数据发送回主函数。如下。
- 1qRegisterMetaType"std::vector<MyGeometry* >");
- 2 //在线程中进行几何运算
- 3 m_pGeoWorker = new CMyWork;
- 4 connect(this, SIGNAL(geoDataReady(const std::vector &)), m_pGeoWorker, SLOT(get(const std::vector &)));
- 5 connect(m_pGeoWorker, SIGNAL(geoResultCompleted(const std::vector &)), this, SLOT(draw(const std::vector &)));
- 6 connect(&m_geoThread, SIGNAL(finished()), m_pGeoWorker, SLOT(deleteLater()));
- 7 m_pGeoWorker->moveToThread(&m_geoThread);
- 8 m_geoThread.start();
Qt 线程的简单使用 (一)
来源: http://www.bubuko.com/infodetail-2002382.html