[Interest] Terminating a QThread

francois cellier f_cellier at yahoo.fr
Fri Jun 21 10:06:34 CEST 2013


Dear all,

Even if I know that it can be dangerous to terminate a thread, I need to do it for my application.
The function that run into the thread is like a long linear sequence of code that has not been designed in a signal/slot way. Moreover, in my thread, I need an eventloop as I use in it some TCP or UDP  Qt sockets.

I have tried the worker approach with the following code and I did not find a way to terminate the thread :

For my thread class :

	1. ThreadEx::ThreadEx(QObject *parent) :
	2.     QThread(parent)
	3. {
	4. }
	5.  
	6. void ThreadEx::run()
	7. {
	8.     QThread::setTerminationEnabled(true);
	9.     exec();
	10. }

For my worker class:

	1. ObjectInThread::ObjectInThread(QObject *parent) :
	2.     QObject(parent)
	3. {
	4. }
	5.  
	6.  
	7. void ObjectInThread::run()
	8. {
	9.    int compteur = 0;
	10. //here i am using a loop instead of the long linear flow  but it is not a loop  in the real code
	11.     while(1)
	12.     {
	13.         qDebug() <<compteur;
	14.         compteur++;
	15.         Sleep(1000);
	16.     }
	17. }
And for my main object that starts the thread

	1. #include "mainobject.h"
	2. #include <QDebug>
	3.  
	4. MainObject::MainObject()
	5. {
	6.     m_thread = new ThreadEx();
	7.     m_object = NULL;
	8. }
	9.  
	10.  
	11. void MainObject::start()
	12. {
	13.     if(m_object)
	14.         delete m_object;
	15.  
	16.     m_object = new ObjectInThread();
	17.     m_object->moveToThread(m_thread);
	18.     QObject::connect(m_thread,SIGNAL(started()),m_object,SLOT(run()));
	19.     m_thread->start();
	20. }
	21.  
	22.  
	23. void MainObject::stop()
	24. {
	25.     qDebug()<<"I try to stop\n";
	26.     m_thread->terminate();
	27. }The start and stop functions are slots called via a simple GUI.
Using the stop slot does nothing.

Moreover I tried the other way of using QThread that consists in inheriting the QThread class and overriding the run method with the code :

void ThreadEx::run()
{
    int compteur = 0;
    while(1)
    {
         qDebug() <<compteur;
         compteur++;
         sleep(1);
    }
}

In that case terminate works but I do not have an eventloop as I did not call the exec method.

Is this the expected behaviour ?

I am using Qt5.1 on centOS / RedHat 6.2. I have also tried this on Windows with no more success.


Thanks for your help,
François
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20130621/2e890896/attachment.html>


More information about the Interest mailing list