I have following code:
class A : public QObject
{
Q_OBJECT
public:
A() : QObject()
{
moveToThread(&t);
t.start();
}
~A()
{
t.quit();
t.wait();
}
void doSomething()
{
QMetaObject::invokeMethod(this,"doSomethingSlot");
}
public slots:
void doSomethingSlot()
{
//do something
emit ready();
}
signals:
void ready();
private:
QThread t;
}
The question why from doSomething it must be call via QMetaObject::invokeMethod. I know that there is something with connection type. Could some one explain what is under the hood?
As you haven’t specified a
Qt::ConnectionType, the method will be invoked asQt::AutoConnection, which means that it will be invoked synchronously (like a normal function call) if the object’s thread affinity is to the current thread, and asynchronously otherwise. “Asynchronously” means that aQEventis constructed and pushed onto the message queue, and will be processed when the event loop reaches it.The reason to use
QMetaObject::invokeMethodif the recipient object might be in another thread is that attempting to call a slot directly on an object in another thread can lead to corruption or worse if it accesses or modifies non-thread-safe data.