Principales améliorations de l'API C++ moderne de RTI Connext DDS
Depuis l'introduction de l'API C++ moderne pour DDS, nous avons vu un intérêt significatif de nos clients. Beaucoup ont commencé à construire de nouveaux systèmes en utilisant C++11, et nous avons continué à affiner l'API avec un certain nombre d'améliorations impactantes.
Mappage IDL amélioré vers C++ moderne
Le Générateur de Code de RTI offre maintenant une nouvelle option -stl, utilisée en conjonction avec -language C++03 ou -language C++11. Cette option met à jour le mappage de plusieurs types IDL :
- Séquences non bornées →
std::vector(nécessite -unboundedSupport) - Séquences bornées →
rti::core::bounded_sequence<T, Bound>. Ce type se comporte commestd::vectormais est optimisé pour la désérialisation. Pour des scénarios à latence plus faible, vous pouvez préférerstd::vectoren utilisant l'annotation@use_vector. - Types chaîne et chaîne large →
std::stringetstd::wstring - Membres annotés avec
@external(la notation pointeur «*») deviennentdds::core::external<T>, un wrapper plus sûr similaire àshared_ptr. Cela protège les membres externes d'être écrasés lorsque le middleware prête de la mémoire (ex. lecture depuis un conteneurLoanedSamples).
Par exemple, donné le type IDL suivant :
struct MyType { sequence<long> my_unbounded_seq; sequence<long, 10> my_bounded_seq; @use_vector sequence<long, 10> my_other_bounded_seq string my_str; @external long my_external; };
En utilisant la commande rtiddsgen -language C++11 -stl -unboundedSupport MyType.idl, la classe C++11 générée ressemble à ceci :
class MyType { public: MyType(); ... MyType (MyType&&) = default; MyType& operator=(MyType&&) = default; MyType& operator=(const MyType&) = default; MyType(const MyType&) = default; std::vector<int32_t>& my_unbounded_seq() noexcept; const std::vector<int32_t>& my_unbounded_seq() const noexcept; void my_unbounded_seq(const std::vector<int32_t>& value); rti::core::bounded_sequence<int32_t, 10>& my_bounded_seq() noexcept; const rti::core::bounded_sequence<int32_t, 10>& my_bounded_seq() const noexcept; void my_bounded_seq(const rti::core::bounded_sequence<int32_t, 10>& value); std::vector<int32_t>& my_other_bounded_seq() noexcept; const std::vector<int32_t>& my_other_bounded_seq() const noexcept; void my_other_bounded_seq(const std::vector<int32_t>& value); std::string& my_str() noexcept; const std::string& my_str() const noexcept; void my_str(const std::string& value); dds::core::external<int32_t>& my_external() noexcept; const dds::core::external<int32_t>& my_external() const noexcept; void my_external(dds::core::external<int32_t> value); ... };
API Requête-Réponse pour C++ moderne
L'API inclut maintenant deux nouvelles entités : rti::request::Requester et rti::request::Replier. Elles fournissent un pattern natif requête-réponse, déjà disponible dans d'autres langages et introduit en prototype dans la version 5.3 et prêt pour la production dans 5.3.0.7.
Un exemple de code concis est disponible ici.
Petites améliorations de l'API
Nous avons simplifié plusieurs tâches courantes :
- Les gestionnaires de condition dans un
WaitSetpeuvent maintenant accepter la condition comme argument, éliminant le besoin de foncteurs sans argument :
condition.handler([]() { // faire quelque chose }); // ou, avec la nouvelle signature condition.handler([](dds::core::cond::Condition c) { // faire quelque chose (condition == c) });
TopicQuery pour données historiques à la demande
TopicQuery, introduit dans 5.3, permet aux applications de récupérer des données historiques à la demande. Dans l'API C++ moderne, vous pouvez créer un TopicQuery à partir d'un DataReader comme ceci :
rti::sub::TopicQuery my_topic_query( my_reader, rti::sub::TopicQuerySelection(dds::topic::Filter("x < 10")) );
Vous pouvez ensuite prendre des échantillons historiques qui correspondent au filtre tout en continuant à recevoir les données en direct normalement.
Regard vers l'avenir
Avec C++17 maintenant approuvé et C++20 à l'horizon, RTI Connext continuera d'évoluer l'API C++ avec des fonctionnalités de langage modernes et des améliorations de performance. Restez à l'écoute ou abonnez-vous au blog RTI pour les dernières mises à jour.
Technologie de l'Internet des objets
- L'IoT : moteur de la renaissance numérique du commerce de proximité
- Traitement de flux de 3e génération : transformer les données IoT en action temps réel
- Pourquoi le déploiement de la 5G est ralenti : coûts, spectre et défis de couverture
- Edge Computing : débloquer les données temps réel, booster l'efficacité et générer de nouveaux revenus
- G.hn : Alimenter la révolution IoT industriel pour une connectivité rentable et fiable
- Repenser la fabrication intelligente pour le nouveau normal : stratégies data-driven pour la résilience
- Données : le nouveau pétrole — Comment les raffineries transforment l'information brute en valeur business
- Le professionnel hybride IT/OT : faire le pont entre data centers et automatisation industrielle
- Microsoft lance un incubateur de recherche IA focalisé sur l'intelligence à usage général