[Interest] Terminating a QThread

Etienne Sandré-Chardonnal etienne.sandre at m4x.org
Fri Jun 21 13:00:34 CEST 2013


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 <http://qt-project.org/doc/QObject.html>
>>    *parent) :
>>    2.     QThread <http://qt-project.org/doc/QThread.html>(parent)
>>    3. {
>>    4. }
>>    5.
>>    6. void ThreadEx::run()
>>    7. {
>>    8.     QThread <http://qt-project.org/doc/QThread.html>::
>>    setTerminationEnabled(true);
>>    9.     exec();
>>    10. }
>>
>>
>>
>> For my worker class:
>>
>>    1. ObjectInThread::ObjectInThread(QObject<http://qt-project.org/doc/QObject.html>
>>    *parent) :
>>    2.     QObject <http://qt-project.org/doc/QObject.html>(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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20130621/8799113d/attachment.html>


More information about the Interest mailing list