[Interest] Terminating a QThread

francois cellier f_cellier at yahoo.fr
Fri Jun 21 13:54:21 CEST 2013


Thanks Etienne and Mandeep for your answers.

However as I wrote in my initial post (in the code of the objectInThread class), in my real application I do not have a while loop just a sequence of functions. With a while loop and the flag the code is clean like that. However, in my case that means I need to check that flag from many classes. For now I did the approach that you were talking using a singleton to get an easy access to that flag from many different classes and I find this not so clean...

However even without speaking about clean things or things to avoid, I would like to know why the terminate function does not terminate my thread if an eventloop is running.




________________________________
 De : Etienne Sandré-Chardonnal <etienne.sandre at m4x.org>
À : 
Cc : "interest at qt-project.org" <interest at qt-project.org> 
Envoyé le : Vendredi 21 juin 2013 13h00
Objet : Re: [Interest] Terminating a QThread
 


Sorry Mandeep, I didn't read your post first. Basically what I posted is similar.

A mutex is a little bit overkill here, you could use an atomic variable 
if you want to be sure, but just a bool flag will be enough as it is 
always set atomically AFAIK



2013/6/21 Mandeep Sandhu <mandeepsandhu.chd at gmail.com>

On Fri, Jun 21, 2013 at 1:36 PM, francois cellier <f_cellier at yahoo.fr> wrote:
>
>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. }
>You use a condition variable in your loop here, which will exit out of the run() function. This variable can be set from your stop() slot (protected by a mutex if needed).
>
>In your main(GUI) thread you can wait for your worker thread to exit:
>
>m_thread->quit();
>m_thread->wait();
>
>
>
>HTH,
>
>-mandeep
>
>
>
>
>This should cleanly exit the thread.
> 
>
>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
>>
>>
>>
>>
>>_______________________________________________
>>Interest mailing list
>>Interest at qt-project.org
>>http://lists.qt-project.org/mailman/listinfo/interest
>>
>>
>
>_______________________________________________
>Interest mailing list
>Interest at qt-project.org
>http://lists.qt-project.org/mailman/listinfo/interest
>
>

_______________________________________________
Interest mailing list
Interest at qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20130621/663de1af/attachment.html>


More information about the Interest mailing list