Pourquoi utiliser QMetaObject :: invokeMethod lors de l'exécution d'une méthode à partir d'un thread
J'ai code suivant:
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;
}
La question de savoir pourquoi de doSomething
il faut appeler via QMetaObject::invokeMethod
. Je sais qu'il y a quelque chose avec le type de connexion. Peut-on expliquer ce qui est sous le capot?
source d'informationauteur krzych
Vous devez vous connecter pour publier un commentaire.
Que vous n'avez pas spécifié de
Qt::ConnectionType
la méthode sera invoquée commeQt::AutoConnection
ce qui signifie qu'il sera appelée de façon synchrone (comme un simple appel de fonction) si l'objet de l'affinité de thread est pour le thread en cours, et de manière asynchrone autrement. "Asynchrone" signifie qu'unQEvent
est construit et poussé sur la file d'attente de messages, et seront traitées lors de l'événement boucle atteint.La raison d'utiliser des
QMetaObject::invokeMethod
si le destinataire de l'objet peut être dans un autre thread, c'est que la tentative d'appeler un slot directement sur un objet dans un autre thread peut conduire à la corruption ou pire si il accède ou modifie non thread-safe données.J'aime cette astuce: