2016-02-25 18:24 GMT+01:00 Murphy, Sean <smur...@walbro.com>: >> > Foo() : QObject(nullptr) { >> > moveToThread(&m_thread); >> > m_thread.start(); >> > } >> > >> > ~Foo() { >> > m_thread.quit(); >> > m_thread.wait(); >> > } >> >> This destructor is either never run or deadlocks. >> >> A QObject can only be destroyed in its thread of affinity. So the above is >> running in that m_thread thread, which means it hasn't exited. Waiting for it >> to exit will wait forever. > > Just when I think I have QObjects and QThreads figured out, I realize I > don't... How do I correctly handle my situation? > > I've got a QObject-based class that talks to a custom device and needs to > block while making reads/writes to that device. This thread runs the entire > duration of my application, because the work it's doing never finishes, it > just monitors the device for messages and notifies my UI class when data > comes in. > > So currently I'm doing this: > > myGUIObject.h: > private: > myBlockingObject* blocking; > QThread* thread; > > myGUIObject.cpp: > myGUIObject() > { > thread = new QThread(this); > blocking = new myBlockingObject(); > blocking->moveToThread(thread); > } > > How/where do I properly delete "blocking"? Right now I'm doing this: > ~myGUIObject() > { > thread->exit(); > blocking->deleteLater(); > } > > But Thiago's comment "A QObject can only be destroyed in its thread of > affinity" sounds like it's not the right way to do it? > Sean
I was in a similar situation some years ago, talking to a USB/serial device in a separate thread. I had a look at the code, and what I did back then was to connect the finished signal of the thread to the deleteLater() slot of the object I had moved to the thread. I actually did the same with the thread itself. So the connect() calls I did to ensure cleanup looked something like this: // Connect to thread signals to start the sensor and clean up. connect(m_sensorThread, SIGNAL(started()), sensor, SLOT(start())); connect(m_sensorThread, SIGNAL(finished()), sensor, SLOT(deleteLater())); connect(m_sensorThread, SIGNAL(finished()), m_sensorThread, SLOT(deleteLater())); Where sensor is the object I had previously moved to m_senseorThread. Not sure if your approach above with calling deleteLater() explicitly and immediately after thread->exit() is right or wrong, or if doing it by signal/slot connections like I did is any better. Just thought I would chime in :) Elvis > _______________________________________________ > 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