Quelle bibliothèque C++ signals / slots choisir?

je veux utiliser une bibliothèque de signaux / slots dans un projet qui n'utilise pas QT. J'ai assez exigences de base:

  1. Connectez deux fonctions avec n'importe quel nombre de paramètres.
  2. Signaux peuvent être connectés à plusieurs emplacements.
  3. déconnexion manuelle de la connexion signal/slot.
  4. performance décente - l'application est basée sur le cadre (c.-à-d. pas basée sur l'événement) et je veux utiliser les connexions dans chaque cadre.

j'ai lu un comparaison entre libsigc++ et Boost.Les signaux. J'ai aussi lu ce Boost.Les signaux souffrent d'une mauvaise performance. Cependant, je sais qu'il y a d'autres bibliothèques et je ne sais toujours pas quelle bibliothèque choisir.

y a-t-il des recommandations pour une bibliothèque signals/slots?

36
demandé sur kshahar 2008-12-11 19:18:22

11 réponses

tout d'abord, essayer avec boost::signal de toute façon. Ne supposez pas qu'il ne sera pas assez rapide jusqu'à ce que vous essayez dans votre cas spécifique qui est votre application

Si ce n'est pas assez efficace, peut-être quelque chose comme FastDelegate convient à vos besoins? (Je ne l'ai pas essayé mais entendu dire que c'était une bonne solution dans certains cas où boost::signal ne semble pas convenir).

de toute façon, si dans votre application utilisez le signal chaque image, il peut être utile de remplacer le système de signal par quelque chose de plus simple, comme un conteneur qui contient des objets/functors qui seront appelés chaque image. Le Signal est plus fait pour permettre une gestion immédiate des "événements" que pour rendre un cycle de boucle dynamique (permettant de changer les fonctions appelées chaque image). (J'ai ma propre solution (mise à JOUR: il est très ancien et archaïque maintenant) que j'ai fortement de l'utiliser dans un jeu et par exemple je n'ai pas de problème avec la performance, donc peut-être quelque chose de semblable pourrait aider).

17
répondu Klaim 2016-11-30 10:20:34

bibliothèque d'événements très, très rapide sur Gamedev.net formulaires--3-->

lors du profilage d'un code que j'avais été travail sur récemment, j'ai été surpris et consterné de voir boost::signal fonctions flottant vers le haut. Pour ceux d'entre vous qui ne connaissent pas, boost::signaux est merveilleusement utile bibliothèque signal / slot utilisable à côté de boost:: bind pour gestion des événements par les délégués, par exemple: on voit en C#. Il est robuste, plein de fonctionnalités et de flexibilité. Il est également, J'ai appris, incroyablement, terriblement lent. Pour beaucoup de gens qui utiliser boost::signal c'est très bien parce qu'ils appellent des événements très rarement. J'appelais plusieurs événements par image par objet, avec des résultats prévisibles.

alors j'ai écrit le mien. Un peu moins souple et plein de fonctionnalités. C'est optimisé pour que tout le monde a tendance à en fait utiliser les événements. Et de l'événement l'invocation est de 15 à 80 fois plus rapide que boost::signaux.

voir lien

14
répondu Dustin Getz 2011-05-20 12:42:28

Les deux que vous avez énumérés sont les deux seuls de la valeur que je suis au courant. Tout ce que j'ai vu a montré libsigc++ en termes de performances. Comme vous l'avez vu dans la comparaison, il y a des cas où la syntaxe de boost est un peu plus jolie, mais juste un peu.

j'ai personnellement utilisé libsigc++ et j'en suis heureux. Libsigc++ semble être utilisé par beaucoup plus de projets. Un coup d'oeil dans mon gestionnaire de paquets répertorie plus de 100 Projets dépendant de libsigc++2. Cela seul est assez à mon avis pour faire pencher la balance surtout compte tenu de l'avantage de performance et l'absence d'autres différences significatives.

je dis libsigc++2.

5
répondu Catskul 2009-09-21 15:40:14

Récemment hérité d'un projet où connect produisait trop de frais généraux pour nos objectifs de projet. Le profilage a révélé l'utilisation d'un mutex dans le signal, ce qui n'était pas nécessaire étant donné notre Utilisation du signal. Remplacé par un faux mutex par le documentation avec le succès. Le mutex est "drastiquement plus lent", donc soyez sûr que vous en avez besoin. Cela peut être utile pour d'autres écrémage de ce post.

Origine typedef boost::signals2::signal_type<void()>::type signal_type;

Nouveau typedef boost::signals2::signal_type<void(), boost::signals2::keywords::mutex_type<boost::signals2::dummy_mutex> >::type signal_type;

5
répondu fionbio 2014-08-28 16:54:31

je vote pour Sigslots, j'ai essayé un couple de d'autres alternatives (boost, libsig++, FastDelegates) et aucun ne semble faire ce que je voulais: relier les fonctions ensemble de manière anonyme avec déconnexion automatique on-object-destruction.

Sigslots était très bien pour nous, parce qu'il est parfaitement lisible en C++, il est rapide, simple, et fait le travail sans. Une petite chose, si vous voulez l'utiliser à partir de plusieurs bibliothèques vous pourriez avoir besoin d'ajouter:

COREEXTERN template class COREIMPEXP has_slots<SIGSLOT_DEFAULT_MT_POLICY>;

pour éviter les problèmes de liens déjà définis-liés à un objet.

4
répondu Rodrigo Lopez 2010-12-30 09:49:38

j'ai déjà utilisé libsigc++, et c'était assez simple. Je ne pense pas que cela aurait beaucoup de conséquences sur les performances, et en effet j'ai appris à aimer utiliser des slots au lieu de pointeurs de fonction à quelques endroits.

une chose à savoir est qu'à la dernière fois que je l'ai utilisé (il y a 2+ ans), il était limité à un maximum de six paramètres passant par les connexions.

je n'ai aucune expérience avec la bibliothèque boost, donc je ne peux pas vous aider y.

3
répondu Caleb Huitt - cjhuitt 2008-12-11 16:57:07

j'ai utilisé boost signals2 bibliothèque, et il est très lent. Sur la construction d'un objet avec des signaux boost, 99% du temps de processeur consommé par la pile de signaux boost. Sur les signaux émettent avec la fente simle simple aussi il y avait très grand au-dessus. J'essaie libsigc++ et c'est beaucoup plus rapide. Libsigc++ semble être très rapide et flexible Création de 40000 objets avec 9 signaux boost et 9 signaux libsigc++:

3
répondu asaenko 2013-12-08 04:43:39

Je n'ai pas utilisé libsig++ mais je l'ai lu. Mon expérience précédente avec les signaux et les fentes sont de Qt et un peu de Boost. Si vous n'avez pas l'un d'eux disponible, alors vous pouvez essayer ma propre bibliothèque de signaux et de slots (ksignals) qui existe à la fois pour le code intégré (pas d'allocation de mémoire dynamique) et le code C++ "normal" (allocation de mémoire dynamique lors de la connexion).

Vous pouvez le trouver à : www.kjellkod.cc/signalandslots

À la page, vous pouvez également trouvez une comparaison: KSignals Vs Boost signals.

les signaux de mise de vitesse sont très rapides et extrêmement légers du point de vue du code. Il devrait être très facile à utiliser, à comprendre et si nécessaire de le modifier.

Bonne chance Égard Kjell H

1
répondu 2010-01-07 14:48:02

encore Une sig-la fente de la mise en œuvre à prendre en compte:

http://code.google.com/p/ting/wiki/SignalSlotUsage

Il n'a pas la prétention d'être le meilleur, mais, encore, une autre qui a son droit d'exister.

1
répondu Ivan 2010-03-11 13:32:45

Une autre option peut être YSignalSlot. Je l'ai utilisé. Je pense qu'il est assez bon.

0
répondu yigityuce 2014-09-04 21:56:53

Qu'en est cette alternative qui semble bon: http://endl.ch/content/fastsig ?

0
répondu Vincent Rich 2014-11-26 17:08:59