[Interest] Terminating a QThread

Mandeep Sandhu mandeepsandhu.chd at gmail.com
Fri Jun 21 10:36:43 CEST 2013


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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20130621/2005a5e0/attachment.html>


More information about the Interest mailing list