Приветствую!
Делаю реализацию класса, который должен обрабатывать данные фоном.
Получилось так:
Заголовочник:
class MyThread : public QObject
{
Q_OBJECT
public:
explicit MyThread(QObject *parent);
~MyThread();
void process();
signals:
void finished();
public slots:
void start();
void stop();
private:
QThread * _thread;
bool _started;
};
Реализация:
#include "mythread.h"
MyThread::MyThread(QObject * parent)
:QObject(0) //-- у нас не должно быть родителя т.к. мы в другом потоке
{
Q_ASSERT(parent!=0);
qDebug()<<"MyThread created";
_started = false;
_thread = new QThread(0); //-- сам поток не должен иметь родителя, что бы он не снёс его ненароком, пока поток выполняется
connect(_thread, &QThread::started, this, &MyThread::process); //-- при запуске потока сразу начинаем работу
connect( this, &MyThread::finished, _thread, &QThread::quit ); //-- как только вся работа сделана или остановлена, останавливаем поток
connect(_thread, &QThread::finished, this, &QObject::deleteLater ); //-- как только поток закончен удаляемся
connect(this, &QObject::destroyed, _thread, &QThread::deleteLater ); //-- Как только удалились, удаляем сам поток
connect(parent, &QObject::destroyed, this, &MyThread::stop); //-- как только родитель удаляется, останавливаем поток
moveToThread(_thread);
}
void MyThread::process()
{
while (true) {
if (!_started) { break; }
QApplication::processEvents(); //-- курим бамбук
}
emit finished();
}
void MyThread::start()
{
qDebug()<<"MyThread start";
_started = true;
_thread->start();
}
void MyThread::stop()
{
qDebug()<<"MyThread stop";
if (!_started) { //-- если мы ещё не запускались, то просто удаляемся
this->deleteLater();
}
_started = false;
}
MyThread::~MyThread()
{
qDebug()<<"MyThread deleted";
}
Вызываю соответственно так:
_myThread = new MyThread(this);
В интернете видел кучу статей: наследование напрямую от QThread, "Правильное использование QThread" с Хабра и т.д.
По большей части все не понравились тем, что нужно писать непосредственно к классу дополнительную обёртку, либо отдельный класс, либо рядом прописывать new QThread(), moveToThread, потом следить за всеми потоками и т.д.
Подскажите, нормальная ли реализация создания, запуска, остановки и удаления потока и класса, если нет, то почему? Какие в ней могут быть подводные камни?