2012-06-27 1 views
5

Je cherchais un code source sur lequel je travaille. J'ai trouvé une déclaration particulière que quelqu'un avait codé. Le code source est une application GUI avec une interface graphique QML et utilise QT 4.7.x.QObject based class a une connexion en attente à elle-même

L'extrait ci-dessous appartient à la logique d'application principale.

// connect signal-slots for decoupling 
QObject::connect (this, SIGNAL(setCurrentTaskSignal(int)), this, 
    SLOT(SetCurrentTaskSlot(int)), Qt::QueuedConnection); 

Il est étrange que l'objet se connecte à lui-même via une connexion en attente, qui signifie essentiellement que l'objet peut « vivre » dans différents threads en même temps? À première vue, ça n'avait aucun sens pour moi. Quelqu'un peut-il penser à une raison quelconque pour laquelle une telle connexion serait plausible ou nécessaire? Est-ce que cela fonctionnerait même?

Répondre

9

Cela fonctionnera sans problème. Peut-être qu'un traitement de boucle d'événement était nécessaire avant d'appeler SetCurrentTaskSlot?

Notez que QueuedConnection ne signifie pas que quelque chose se trouve dans un thread différent. QueuedConnection signifie seulement que lorsque le signal est émis, l'emplacement correspondant ne sera pas appelé directement. Il sera mis en file d'attente sur la boucle d'événements et sera traité lorsque le contrôle sera renvoyé à la boucle d'événements

+0

Fait sens. Je regarde toujours les choses entourant le code. Donc, je serai de retour une fois son clair ce qui se passe. –

+1

Il ressemble à un signal de changement de tâche est émise tout en effectuant certains calculs et que le « changement » ne devrait pas se produire immédiatement, mais après le passage du courant est exécuté et le traitement des événements reprend. –

3

La connexion en attente n'indique rien sur l'emplacement du récepteur. L'inverse est vrai: pour envoyer en toute sécurité des signaux à un objet vivant dans un autre thread, vous devez utiliser des connexions en file d'attente. Mais vous pouvez les utiliser pour un objet vivant dans n'importe quel fil! On utilise une connexion en file d'attente pour s'assurer que le signal sera délivré à partir de la boucle d'événement, et non immédiatement à partir du site d'émission, comme cela se produit avec une connexion directe. La connexion directe est conceptuellement un ensemble d'appels à des pointeurs de fonction sur une liste. La connexion en file d'attente est conceptuellement un événement envoyé à un récepteur intelligent qui peut exécuter un appel de fonction en fonction du contenu de l'événement.

L'événement est le QMetaCallEvent interne et QObject::event qui agit sur cet événement et exécute l'appel.

Questions connexes