[Interest] QThread and sleep
Thiago Macieira
thiago.macieira at intel.com
Tue Mar 19 16:08:50 CET 2013
On terça-feira, 19 de março de 2013 10.37.56, Hugo Drumond Jacob wrote:
> Hi folks!
>
> Today some doubt has ocurred on my office. Suppose that for some
> reason we need to sleep a thread (not the main thread) for some time
Suppose that you're wrong and you came to the wrong solution that sleeping is
the way to go. Try to find a solution that makes you do what you need to do and
not sleep.
> (eg. 100 ms). The QThread::wait(int) "provides similar functionality
> to the POSIX pthread_join()" and this don't will sleep the target
> thread, but the caller thread.
>
> Call the QThread::wait(int) from the target thread is forbidden
> (according to line 651 of qthread_unix.cpp).
You were looking for QThread::sleep, not wait. The latter is used to wait for
a thread to finish, with a given timeout. The former suspends and blocks
execution of the calling thread for a given time.
> Furthermore, is "wrong" call QThread::wait(int) except for
> synchronously thread termination with QThread::terminate() ? ( I know,
> isn't so healthy use QThread::terminate() ) QThread::wait(int) is a
> busy wait, right?
No, it isn't. It's like a pthread_join: it will suspend the execution of the
calling thread until the other thread exits or the timeout happens, whichever
comes first. QThread::wait() is normal use and is, in fact, used even by the
QThread destructor.
QThread::sleep() is, more often than not, a bad choice. Avoid it if you can.
If you can't, redesign your code so you don't need to use it.
> The attached code illustrate the question.
Your example has the main thread waiting for 100 ms for the auxiliary thread
to exit. But your auxiliary thread is busy-looping doing a qDebug and will
never exit. Since it doesn't exit, QThread::wait() will always timeout.
> My immediate solution is: create some MyThread class inherited of
> QThread just for expose the QThread::*sleep(unsigned long) methods and
> create some slot or Q_INVOKABLE method on Worker to call these exposed
> methods. Anyone propose some more elegant solution?
Yes: don't sleep.
--
Thiago Macieira - thiago.macieira (AT) intel.com
Software Architect - Intel Open Source Technology Center
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 190 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20130319/23c89589/attachment.sig>
More information about the Interest
mailing list