Sijith
Sijith

Reputation: 3922

Deleting Qthread on the middle of running

I created a thread with class A and after deleted class A, the thread is not deleted. It continues running.

I explicitly called the thread destructor, quit and exit function but still, the thread did not stop running.

Is there any thing like KILL function to stop the thread execution

void A::init()
{
    WorkerThread *Thread = new WorkerThread(this);
}

void B::slotClose()
{
    A *obj = getObj();
    if(obj)
    {
    m_pScene->removeItem(obj);
    obj->deleteLater(); // this calls thread distructor also but thread execution is not stopping
    }
}

Upvotes: 0

Views: 1246

Answers (1)

Konrad
Konrad

Reputation: 7198

From the docs:

Note that deleting a QThread object will not stop the execution of the thread it manages. Deleting a running QThread (i.e. isFinished() returns false) will result in a program crash. Wait for the finished() signal before deleting the QThread.

You should never delete a running QThread object.

So I think it would be the best for you to write some termination/quitting logic in your WorkerThread, expose some slot for example quit and connect signal with this quit slot.

If you just want to terminate the thread no matter what, just connect destroyed SIGNAL to terminate SLOT (http://doc.qt.io/qt-5/qthread.html#terminate)

So assuming your A class derives from QObject, what would you do inside this class is:

connect(this, SIGNAL(destroyed()), Thread, terminate());

If you have your own slot quit exposed, so you make sure you properly stop all that's executing in your loop just instead terminate() use quit().

connect(this, SIGNAL(destroyed()), Thread, quit());

Here's an example of implementing such a logic: http://blog.debao.me/2013/08/how-to-use-qthread-in-the-right-way-part-1/

Or just put quit = true in your ThreadWorker destructor.

It should be straightforward. Good luck!

Also some official documentation with examples (imo doing it right):

https://wiki.qt.io/QThreads_general_usage

https://doc.qt.io/archives/qt-5.8/qtnetwork-blockingfortuneclient-example.html

https://doc.qt.io/archives/qt-5.8/qtcore-threads-mandelbrot-example.html

Upvotes: 1

Related Questions