Thanks Thiago! 2013/3/19 Thiago Macieira <thiago.macie...@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@qt-project.org > http://lists.qt-project.org/mailman/listinfo/interest > _______________________________________________ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest