Я много читал о том, как работать с потоками в 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
Какие подводные камни есть у такого варианта?
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть код который подсчитывает кол-во символов и слов в переменной $textС подсчётом символов всё хорошо , но с подсчётом слов есть один баг(фича)
Необходимо сделать подсчёт количества символов в текстовом файле, а затем рассчитать примерное количество времени для прочтения текстаВсё...
Вопрос в загаловке, есть форма: