(7条消息) 三十九、Qt 多线程使用moveToThread
一、具体的使用步骤如下:
1.从QObject派生一个类,将耗时的工作写在该类的槽函数中。
2.将派生类对象移动到一个QThread中,该线程需要start。(这一步使用moveToThread)
3.通过信号连接派生类的槽函数,并通过信号触发槽函数。(槽函数在子线程中执行)
二、案例
1、自定义Worker类,将线程中的逻辑在该类中以槽函数的方式实现:
#ifndef WORKER_H#define WORKER_H #include <QObject> class Worker : public QObject{ Q_OBJECTpublic: explicit Worker(QObject *parent = nullptr); ~Worker();signals: void finished();//完成信号 public slots: void doSomething();}; #endif // WORKER_H
Worker.cpp
#include "worker.h"#include <QDebug> Worker::Worker(QObject *parent) : QObject(parent){ } Worker::~Worker(){ qDebug()<<"free worker...";} void Worker::doSomething(){ qDebug()<<"do something..."; emit finished();}
2、调用处代码:
QThread *thread = new QThread; Worker*worker = new Worker; connect(worker,SIGNAL(finished()),thread,SLOT(quit()));//新增 connect(thread,SIGNAL(started()),worker,SLOT(doSomething())); connect(thread,SIGNAL(finished()),worker,SLOT(deleteLater())); connect(thread,SIGNAL(finished()),thread,SLOT(deleteLater())); worker->moveToThread(thread); thread->start();
注意:由于
Worker#doSomething()
执行完毕后,线程并不会结束,这样若不做额外控制,那么就会导致thread
和worker
的内存泄漏。所以需要在worker
对象的槽函数doSomething()
结束的时候,应发射结束信号来间接控制线程!
赞 (0)