samedi 25 juin 2016

Stop Qt Thread : calling exit() or quit() does not stop the thread execution

Created a QThread in main() i.e Main thread. Moved a worker class to the new thread. The thread executes the 'StartThread' method of worker class. Worker Thread: //header file class Worker : public QObject { Q_OBJECT public: Worker(QThread* thread); public slots: void StartThread(); void EndThread(); private: QThread* m_pCurrentThread; }; // source file #include "QDebug" #include "QThread" #include "worker.h" Worker::Worker(QThread* thread) { m_pCurrentThread = thread; } void Worker::StartThread() { qDebug() << " StartThread"; while(true) { QThread::msleep(1000); qDebug() << " thread running"; static int count = 0; count++; if(count == 10) { break; } if(m_pCurrentThread->isInterruptionRequested()) { qDebug() << " is interrupt requested"; // Option 3: m_pCurrentThread->exit(); } } qDebug() << "StartThread finished"; } void Worker::EndThread() { qDebug() << "thread finished"; } Main.cpp #include <QCoreApplication> #include "worker.h" #include "QThread" #include "QObject" #include "QDebug" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QThread* thread = new QThread(); Worker* workerObj = new Worker(thread); QObject::connect(thread, SIGNAL(started()), workerObj, SLOT(StartThread())); QObject::connect(thread, SIGNAL(finished()), workerObj, SLOT(EndThread())); workerObj->moveToThread(thread); thread->start(); thread->requestInterruption(); QThread::msleep(2000); qDebug() << "terminate thread"; if(thread->isRunning()) { // Option 1,2 exit() / quit() used but got same output thread->exit(); qDebug() << "wait on thread"; thread->wait(); } qDebug() << " exiting main"; return a.exec(); } Now before the 'StartThread' completes and thread is exited gracefully I want to stop the thread from Main thread. Used, thread->exit() and waited (thread->wait()) in the Main thread. thread->quit() and waited (thread->wait()) in the Main thread. exit() in the 'StartThread' Expected: The thread execution should stop as soon as exit()/quit() is called from Main thread. Actual: In all three instances the thread keeps running, completes the 'StartThread' method and exits gracefully. As good as not exit()/quit() was called. output: StartThread thread running is interrupt requested terminate thread wait on thread thread running is interrupt requested thread running is interrupt requested thread running is interrupt requested thread running is interrupt requested thread running is interrupt requested thread running is interrupt requested thread running is interrupt requested thread running is interrupt requested thread running StartThread finished thread finished exiting main Is it possible to stop/dispose the thread as in when required by the main thread?

Aucun commentaire:

Enregistrer un commentaire