Hi, This was my case, but after a careful study of how the event loop and queued signal/slot connection works, I figured it out and everything works cleanly now. It's easy to have this issue, as if you ask the thread to quit via a signal/slot, you have to ensure that nothing is destroyed or blocked.
For the non-eventloop threads, I just use a quit flag as mentionned, it works perfectly. For the eventloop/QObject-worker threads, for instance, I have a RenderClient, which creates a QThread, a RenderClientPrivate, and makes the RenderClientPrivate run in the QThread. The RenderClient is then a wrapper interface for controlling the RenderClientPrivate from the main thread. Here are definitions/initializations: RenderClient::RenderClient(QObject * parent) : QObject(parent), state(Idle) { //Create a thread clientThread = new QThread(this); //Create a RenderClientPrivate and move it to the new thread RenderClientPrivate * clientPrivate = new RenderClientPrivate(); clientPrivate->moveToThread(clientThread); //Destroy the renderer object when the threads exits from event loop connect(clientThread, SIGNAL(finished()), clientPrivate, SLOT(deleteLater())); } RenderClient::~RenderClient(){ debug("RenderClient : destroyed"); //Ensure renderThread finishes its execution as it will be deleted (child) if(clientThread->isRunning()) { clientThread->quit(); //When the thread emits finished(), the RenderClientPrivate object will be deleted, and wait() will return if(!clientThread->wait(30000)) { warning("RenderClient::~RenderClient : thread timeout, forced thread to terminate"); clientThread->terminate(); } }} That way, the terminate() is never called, and everything gets destroyed properly. just to put in my 2 windows cents: > sometimes my threads even don't stop when i quit() them and a wait() waits > forever... > > so terminate is my only chance for this. > >
_______________________________________________ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest