49 votes

Qt Signaux et Slot connectés deux fois ... que se passe-t-il?

Que se passe-t-il si le même signal et slot est connecté deux fois?

Comment le mécanisme est-il géré?

50voto

San Jacinto Points 6109

Il y a quelques semaines, nous avons eu un stagiaire qui a accidentellement connecté un signal à un slot plus d'une fois. L'idée était que dans une condition, vous auriez le slot connecté au signal, et dans une autre condition vous le déconnecteriez. Lorsque vous changiez de modes, vous faisiez le travail approprié.

Eh bien, il a oublié de déconnecter lorsque c'était nécessaire. Donc, chaque fois que vous changiez de modes, vous aviez une nouvelle connexion au slot.

Le résultat final ? 1 connection == 1 appel au slot. 2 connections == 2 appels au slot. 3 connections == 3 appels au slot, etc. Ces appels se sont produits "simultanément" (je sais en réalité qu'ils ne l'étaient pas car ils sont sur le même fil d'événement, mais ce que je veux dire, c'est que tous les appels ont été traités successivement).

Comme mtvec le souligne dans l'un de ses commentaires (il mérite du crédit, donc ne me votez pas pour son travail), Qt::UniqueConnection préviendrait ce problème.

8voto

Troubadour Points 9485

Généralement, des choses mauvaises. Il est parfaitement acceptable de connecter la fente deux fois, voire même plusieurs fois, mais lorsque le signal est déclenché, votre fente sera appelée pour chaque connexion que vous avez faite, ce qui n'est probablement pas ce que vous voulez.

Notez qu'il n'est pas nécessairement incorrect d'avoir des connexions multiples. Il existe (probablement) des utilisations parfaitement valides. Ils sont assez rares, je ne peux certainement pas penser à un moment où je l'ai utilisé comme une fonctionnalité. Toutes les situations que je me rappelle où il y avait une connexion multiple se sont avérées être un bug plutôt que prévues.

6voto

Frank Osterfeld Points 13125

Le slot est exécuté plusieurs fois (comme d'autres l'ont déjà dit).

Quelques notes supplémentaires :

  • Auparavant, le motif pour "connecter exactement une fois" dans les cas où il pourrait y avoir eu une connexion précédente, était d'abord d'appeler disconnect puis connect pour imposer une seule connexion.
  • Maintenant, depuis la version 4.6, il y a aussi la connexion plus élégante Qt::UniqueConnection, voir http://doc.qt.io/qt-5/qt.html#ConnectionType-enum

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X