[Interest] QThread and sleep

Hugo Drumond Jacob hugo at jacob.eng.br
Tue Mar 19 18:14:20 CET 2013


Thanks Thiago!

2013/3/19 Thiago Macieira <thiago.macieira at intel.com>:
> 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?

Sorry! I want to say "isn't a busy wait".

>
> 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.

In fact, we have a class inherited of QThread that can change the
default scheduler of thread to use Linux SCHED_FIFO and really change
the thread priority. We are using that way because we need to
manipulate some GPIO pins with more resolution than QTimer ( in order
of micro seconds ). So, "the best" way ( understand more quickly way )
to solve this is using sleep. Only for knowledge: some delay of kernel
context switching don't affect our application of GPIO pins and we
trying to avoid PREEMPRT patch.

>
> --
> Thiago Macieira - thiago.macieira (AT) intel.com
>   Software Architect - Intel Open Source Technology Center
>
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest
>



More information about the Interest mailing list