J'ai un objet QObject qui a plusieurs slots connectés à l'un de ses signaux. Y a-t-il un ordre dans lequel chacun de ces emplacements est appelé lorsque le signal est émis?Ordre des emplacements appelés sur QObject
Répondre
Dans Qt v4.5 et versions antérieures: Non, l'ordre est indéfini comme on peut le voir dans the documentation here:
Si plusieurs emplacements sont connectés à un signal, les créneaux horaires seront exécutés l'un après l'autre, dans un ordre arbitraire, lorsque le signal est émis.
Éditer: À partir de la version 4.6 ce n'est plus vrai. Maintenant, les slots vont fonctionner dans l'ordre où ils sont connectés. Le paragraphe pertinent de the current documentation:
Si plusieurs emplacements sont connectés à un signal, les créneaux horaires seront exécutés l'un après l'autre, dans l'ordre où ils ont été connectés, lorsque le signal est émis
Alors que la commande est indéfinie, jusqu'à présent, dans toutes les versions Qt, elle a été connect()
, sauf lorsque Qt::QueuedConnection
est utilisé, auquel cas, bien sûr, il n'est même pas garanti que tous les emplacements aient été exécutés lorsque emit
retourne. S'appuyer sur la commande est toujours découragé, cependant.
Selon la documentation Qt:
Si sont connectés plusieurs emplacements à un signal , les fentes seront exécutées une après l'autre, dans l'ordre ont été connectés, lorsque le signal est émis.
Pas mal. Dépend de la version Qt. –
En se fondant sur quel ordre les créneaux horaires seront exécutés est une mauvaise, mauvaise idée, car elle va à l'encontre à la fois l'esprit des signaux/connexions de machines à sous et vous laisse grand ouvert pour le comportement indésirable si vous toute sorte de connexions programmatiques de signaux & fentes.
@Hossein Ma réponse était correcte jusqu'à la version 4.6 de QT. Si vous regardez la date de la question (et ma réponse), vous verrez que c'était la bonne réponse quand la question a été posée. Notez que la réponse de Yaroslav a été postée plus d'un an plus tard. – sepp2k
OK, désolé, je ne voulais pas sous-évaluer votre message. Puisque cette question est apparue comme le premier résultat de la recherche Google que j'ai faite, je voulais empêcher d'autres lecteurs de prêter à confusion. – Hossein
vous devez utiliser des connexions en file d'attente pour que cela soit vrai pour différents threads. Je dis juste. – smsware