<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 14 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:PMingLiU;
        panose-1:2 2 5 0 0 0 0 0 0 0;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:"\@PMingLiU";
        panose-1:2 2 5 0 0 0 0 0 0 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:79719186;
        mso-list-template-ids:-1138091760;}
@list l1
        {mso-list-id:1404835737;
        mso-list-template-ids:19828424;}
ol
        {margin-bottom:0cm;}
ul
        {margin-bottom:0cm;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-AU link=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>But a bool value can be cached indefinitely, so make sure you declare the flag as volatile!  <o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Tony<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><div style='border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt'><div><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal><b><span lang=EN-US style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span lang=EN-US style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> interest-bounces+tony=rightsoft.com.au@qt-project.org [mailto:interest-bounces+tony=rightsoft.com.au@qt-project.org] <b>On Behalf Of </b>Etienne Sandré-Chardonnal<br><b>Sent:</b> Friday, 21 June 2013 9:01 PM<br><b>Cc:</b> interest@qt-project.org<br><b>Subject:</b> Re: [Interest] Terminating a QThread<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p> </o:p></p><div><div><p class=MsoNormal style='margin-bottom:12.0pt'>Sorry Mandeep, I didn't read your post first. Basically what I posted is similar.<o:p></o:p></p></div><p class=MsoNormal>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<o:p></o:p></p></div><div><p class=MsoNormal style='margin-bottom:12.0pt'><o:p> </o:p></p><div><p class=MsoNormal>2013/6/21 Mandeep Sandhu <<a href="mailto:mandeepsandhu.chd@gmail.com" target="_blank">mandeepsandhu.chd@gmail.com</a>><o:p></o:p></p><div><div><div><div><p class=MsoNormal>On Fri, Jun 21, 2013 at 1:36 PM, francois cellier <<a href="mailto:f_cellier@yahoo.fr" target="_blank">f_cellier@yahoo.fr</a>> wrote:<o:p></o:p></p><div><div><p class=MsoNormal><span style='font-family:"Tahoma","sans-serif"'>Dear all,<br><br>Even if I know that it can be dangerous to terminate a thread, I need to do it for my application.<br>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.<br><br>I have tried the worker approach with the following code and I did not find a way to terminate the thread :<br><br>For my thread class :<o:p></o:p></span></p><div><div><ol start=1 type=1><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l1 level1 lfo1'><span style='font-family:"Tahoma","sans-serif"'>ThreadEx::ThreadEx(<a href="http://qt-project.org/doc/QObject.html" target="_blank">QObject</a> *parent) :<o:p></o:p></span></li></ol></div><div><ol start=2 type=1><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l1 level1 lfo1'><span style='font-family:"Tahoma","sans-serif"'>    <a href="http://qt-project.org/doc/QThread.html" target="_blank">QThread</a>(parent)<o:p></o:p></span></li></ol></div><div><ol start=3 type=1><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l1 level1 lfo1'><span style='font-family:"Tahoma","sans-serif"'>{<o:p></o:p></span></li></ol></div><div><ol start=4 type=1><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l1 level1 lfo1'><span style='font-family:"Tahoma","sans-serif"'>}<o:p></o:p></span></li></ol></div><div><ol start=5 type=1><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l1 level1 lfo1'><span style='font-family:"Tahoma","sans-serif"'> <o:p></o:p></span></li></ol></div><div><ol start=6 type=1><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l1 level1 lfo1'><span style='font-family:"Tahoma","sans-serif"'>void ThreadEx::run()<o:p></o:p></span></li></ol></div><div><ol start=7 type=1><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l1 level1 lfo1'><span style='font-family:"Tahoma","sans-serif"'>{<o:p></o:p></span></li></ol></div><div><ol start=8 type=1><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l1 level1 lfo1'><span style='font-family:"Tahoma","sans-serif"'>    <a href="http://qt-project.org/doc/QThread.html" target="_blank">QThread</a>::setTerminationEnabled(true);<o:p></o:p></span></li></ol></div><div><ol start=9 type=1><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l1 level1 lfo1'><span style='font-family:"Tahoma","sans-serif"'>    exec();<o:p></o:p></span></li></ol></div><div><ol start=10 type=1><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l1 level1 lfo1'><span style='font-family:"Tahoma","sans-serif"'>}<o:p></o:p></span></li></ol></div></div><p class=MsoNormal><span style='font-family:"Tahoma","sans-serif"'><br><br>For my worker class:<o:p></o:p></span></p><div><ol start=1 type=1><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo2'><span style='font-family:"Tahoma","sans-serif"'>ObjectInThread::ObjectInThread(<a href="http://qt-project.org/doc/QObject.html" target="_blank">QObject</a> *parent) :<o:p></o:p></span></li></ol></div><div><ol start=2 type=1><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo2'><span style='font-family:"Tahoma","sans-serif"'>    <a href="http://qt-project.org/doc/QObject.html" target="_blank">QObject</a>(parent)<o:p></o:p></span></li></ol></div><div><ol start=3 type=1><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo2'><span style='font-family:"Tahoma","sans-serif"'>{<o:p></o:p></span></li></ol></div><div><ol start=4 type=1><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo2'><span style='font-family:"Tahoma","sans-serif"'>}<o:p></o:p></span></li></ol></div><div><ol start=5 type=1><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo2'><span style='font-family:"Tahoma","sans-serif"'> <o:p></o:p></span></li></ol></div><div><ol start=6 type=1><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo2'><span style='font-family:"Tahoma","sans-serif"'> <o:p></o:p></span></li></ol></div><div><ol start=7 type=1><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo2'><span style='font-family:"Tahoma","sans-serif"'>void ObjectInThread::run()<o:p></o:p></span></li></ol></div><div><ol start=8 type=1><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo2'><span style='font-family:"Tahoma","sans-serif"'>{<o:p></o:p></span></li></ol></div><div><ol start=9 type=1><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo2'><span style='font-family:"Tahoma","sans-serif"'>   int compteur = 0;<o:p></o:p></span></li></ol></div><div><ol start=10 type=1><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo2'><span style='font-family:"Tahoma","sans-serif"'>//here i am using a loop instead of the long linear flow  but it is not a loop  in the real code<o:p></o:p></span></li></ol></div><div><ol start=11 type=1><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo2'><span style='font-family:"Tahoma","sans-serif"'>    while(1)<o:p></o:p></span></li></ol></div><div><ol start=12 type=1><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo2'><span style='font-family:"Tahoma","sans-serif"'>    {<o:p></o:p></span></li></ol></div><div><ol start=13 type=1><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo2'><span style='font-family:"Tahoma","sans-serif"'>        qDebug() <<compteur;<o:p></o:p></span></li></ol></div><div><ol start=14 type=1><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo2'><span style='font-family:"Tahoma","sans-serif"'>        compteur++;<o:p></o:p></span></li></ol></div><div><ol start=15 type=1><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo2'><span style='font-family:"Tahoma","sans-serif"'>        Sleep(1000);<o:p></o:p></span></li></ol></div><div><ol start=16 type=1><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo2'><span style='font-family:"Tahoma","sans-serif"'>    }<o:p></o:p></span></li></ol></div><div><ol start=17 type=1><li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo2'><span style='font-family:"Tahoma","sans-serif"'>}<o:p></o:p></span></li></ol></div></div></div></div><div><p class=MsoNormal>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).<o:p></o:p></p></div><div><p class=MsoNormal>In your main(GUI) thread you can wait for your worker thread to exit:<br><br>m_thread->quit();<br>m_thread->wait();<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>HTH,<o:p></o:p></p></div><div><p class=MsoNormal style='margin-bottom:12.0pt'>-mandeep<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>This should cleanly exit the thread.<br> <o:p></o:p></p></div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-right:0cm'><div><div><div><p class=MsoNormal style='margin-bottom:12.0pt'><span style='font-family:"Tahoma","sans-serif"'>Moreover I tried the other way of using QThread that consists in inheriting the QThread class and overriding the run method with the code :<br><br>void ThreadEx::run()<br>{<br>    int compteur = 0;<br>    while(1)<br>    {<br>         qDebug() <<compteur;<br>         compteur++;<br>         sleep(1);<br>    }<br>}<br><br>In that case terminate works but I do not have an eventloop as I did not call the exec method.<br><br>Is this the expected behaviour ?<br><br>I am using Qt5.1 on centOS / RedHat 6.2. I have also tried this on Windows with no more success.<o:p></o:p></span></p><div><p class=MsoNormal><span style='font-family:"Tahoma","sans-serif"'>Thanks for your help,<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-family:"Tahoma","sans-serif"'>François<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-family:"Tahoma","sans-serif"'><o:p> </o:p></span></p></div><div><p class=MsoNormal><span style='font-family:"Tahoma","sans-serif"'><o:p> </o:p></span></p></div></div></div><p class=MsoNormal><o:p> </o:p></p></div><p class=MsoNormal style='margin-bottom:12.0pt'>_______________________________________________<br>Interest mailing list<br><a href="mailto:Interest@qt-project.org" target="_blank">Interest@qt-project.org</a><br><a href="http://lists.qt-project.org/mailman/listinfo/interest" target="_blank">http://lists.qt-project.org/mailman/listinfo/interest</a><o:p></o:p></p></blockquote></div><p class=MsoNormal><o:p> </o:p></p></div></div><p class=MsoNormal style='margin-bottom:12.0pt'><br>_______________________________________________<br>Interest mailing list<br><a href="mailto:Interest@qt-project.org">Interest@qt-project.org</a><br><a href="http://lists.qt-project.org/mailman/listinfo/interest" target="_blank">http://lists.qt-project.org/mailman/listinfo/interest</a><o:p></o:p></p></div><p class=MsoNormal><o:p> </o:p></p></div></div></div></body></html>