Задать вопрос
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, потом следить за всеми потоками и т.д.

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

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

Похожие вопросы