PavelK
@PavelK

Реализация QThread в Qt — правильна ли сделал и какие есть подводные камни?

Приветствую!
Делаю реализацию класса, который должен обрабатывать данные фоном.
Получилось так:
Заголовочник:
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, потом следить за всеми потоками и т.д.

Подскажите, нормальная ли реализация создания, запуска, остановки и удаления потока и класса, если нет, то почему? Какие в ней могут быть подводные камни?
  • Вопрос задан
  • 646 просмотров
Пригласить эксперта
Ответы на вопрос 1
Rou1997
@Rou1997
Не вижу никакой реализации, код ничего не делает, поэтому ответить не могу, пусть даже курит бамбук!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы