Qt, потоки и объекты. Как правильно?

Я много читал о том, как работать с потоками в Qt. Кто-то наследуется от QThread и переопределяет void run();, кто-то наследует класс worker от QObject, связывает через сигнал-слоты с объектом QThread и перемещает его туда. Но насколько правильно делать вот так:

Конструктор:

DatabaseAccessor::DatabaseAccessor()
{

    dbThread = new QThread();   //создаем новый поток
    this->moveToThread(dbThread);       // перемещаем себя в новый поток

    dbThread->start();      // запускаем поток

    tmr = new QTimer();     //создаем таймер
    tmr->moveToThread(dbThread);


    connect(dbThread,dbThread->finished, [](){   //проверяем, что поток завершился
       qDebug() << "dbThread finished";
    });
    connect(dbThread,dbThread->destroyed, [](){     //проверяем, что объект потока уничтожен
       qDebug() << "dbThread destroyed";
    });
    connect(tmr,tmr->destroyed, [](){       //проверяем, что объект таймера уничтожен
       qDebug() << "timer destroyed";
    });

    connect(tmr, tmr->timeout, this, this->checkDbCon);     //подключаем таймер к слоту
    
    qDebug() << "поток объекта" << this->thread() 
             <<  " dbThread " << dbThread 
             << " timerThread" << tmr->thread(); // проверяем, что все живут в одном потоке
}

Деструктор:

DatabaseAccessor::~DatabaseAccessor()
{
    tmr->deleteLater();
    dbThread->quit();   //завершаем поток
    dbThread->deleteLater();
}

Вывод в консоль:

поток объекта QThread(0x182d34d0)  dbThread  QThread(0x182d34d0)  timerThread QThread(0x182d34d0)
con res = true
таймер сработал
таймер сработал
can change db
con res = true
таймер сработал
//тут я убиваю объект
dbThread finished
timer destroyed
dbThread destroyed

Какие подводные камни есть у такого варианта?


Ответы (0 шт):