C++ (Qt)Controller::Controller(QObject *parent) : QObject(parent){ worker = new Worker; worker->moveToThread(&workerThread); workerThread.start();}Controller::~Controller() { workerThread.quit(); workerThread.wait(); worker->deleteLater();}
C++ (Qt)Worker::Worker(QObject *parent) : QObject(parent){ workerThread = new QThread; moveToThread(workerThread); workerThread->start();} Worker::~Worker() { workerThread->quit(); workerThread->wait(); workerThread->deleteLater();}
C++ (Qt)Worker::~Worker() { workerThread->quit(); if (QThread::currentThread() != workerThread) workerThread->wait(); workerThread->deleteLater();}
C++ (Qt)// деструктор вызывается в потоке workerThreadWorker::~Worker() { // в потоке workerThread обращаемся к объекту главного потока workerThread // (возможны проблемы с конкурентным доступом) с командой завершения QEventLoop workerThread->quit(); // в потоке workerThread обращаемся к объекту главного потока workerThread // (возможны проблемы с конкурентным доступом) с командой ожидания завершения активности данного потока // получаем игнорирование команды и не завершенный поток workerThread workerThread->wait(); // в очередь главный поток отправляем событие удаления объекта workerThread, // которое может быть обработано в главном потоке даже до завершения этого деструктора, // когда активность потока workerThread фактически не завершена. workerThread->deleteLater();}
C++ (Qt)Worker::~Worker() { workerThread->quit(); workerThread->deleteLater();}