Que se passe-t-il si le même signal et slot est connecté deux fois?
Comment le mécanisme est-il géré?
Que se passe-t-il si le même signal et slot est connecté deux fois?
Comment le mécanisme est-il géré?
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.
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.
Le slot est exécuté plusieurs fois (comme d'autres l'ont déjà dit).
Quelques notes supplémentaires :
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.