Wesentliche Verbesserungen in RTI Connexts Modern C++ DDS API
Seit wir die Modern C++ API für DDS eingeführt haben, sehen wir signifikantes Interesse von unseren Kunden. Viele haben begonnen, neue Systeme mit C++11 zu bauen, und wir haben die API mit einer Reihe wirkungsvoller Verbesserungen kontinuierlich verfeinert.
Verbessertes IDL-Mapping zu Modern C++
RTIs Code Generator bietet nun eine neue -stl Option, verwendet in Kombination mit -language C++03 oder -language C++11. Diese Option aktualisiert das Mapping mehrerer IDL-Typen:
- Unbounded Sequences →
std::vector(erfordert -unboundedSupport) - Bounded Sequences →
rti::core::bounded_sequence<T, Bound>. Dieser Typ verhält sich wiestd::vector, ist aber für Deserialisierung optimiert. Für niedrigere Latenz-Szenarien können Siestd::vectormittels@use_vectorAnnotation bevorzugen. - String und Wide-String-Typen →
std::stringundstd::wstring - Mit
@externalannotierte Member (die „*“ Pointer-Notation) werden zudds::core::external<T>, ein sicherer Wrapper ähnlichshared_ptr. Dies schützt externe Member davor, überschrieben zu werden, wenn der Middleware Speicher leiht (z. B. beim Lesen aus einemLoanedSamplesContainer).
Beispiel: Gegeben der folgende IDL-Typ:
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; };
Mit dem Kommando rtiddsgen -language C++11 -stl -unboundedSupport MyType.idl sieht die generierte C++11-Klasse so aus:
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); ... };
Request-Reply API für Modern C++
Die API umfasst nun zwei neue Entitäten: rti::request::Requester und rti::request::Replier. Diese bieten ein natives Request-Reply-Pattern, das bereits in anderen Sprachen verfügbar ist und in Version 5.3 als Prototyp eingeführt sowie in 5.3.0.7 production-ready gemacht wurde.
Ein prägnantes Code-Beispiel ist hier verfügbar.
Kleinere API-Verbesserungen
Wir haben mehrere häufige Aufgaben vereinfacht:
- Condition Handler in einem
WaitSetkönnen nun die Condition als Argument akzeptieren, was die Notwendigkeit no-argument Functors eliminiert:
condition.handler([]() { // do something }); // or, with the new signature condition.handler([](dds::core::cond::Condition c) { // do something (condition == c) });
TopicQuery für On-Demand-Historische Daten
TopicQuery, eingeführt in 5.3, erlaubt Applikationen, historische Daten on-demand abzurufen. In der Modern C++ API können Sie einen TopicQuery von einem DataReader so erstellen:
rti::sub::TopicQuery my_topic_query( my_reader, rti::sub::TopicQuerySelection(dds::topic::Filter("x < 10")) );
Sie können dann historische Samples, die den Filter matchen, entnehmen, während Sie Live-Daten normal weiter empfangen.
Ausblick
Mit C++17 nun approbiert und C++20 am Horizont, wird RTI Connext die C++ API kontinuierlich mit modernen Sprachfeatures und Performance-Verbesserungen weiterentwickeln. Bleiben Sie dran oder abonnieren Sie den RTI Blog für die neuesten Updates.
Internet der Dinge-Technologie
- IoT: Treiber der digitalen Renaissance der High Street
- Third-Generation Stream Processing: IoT-Daten in Echtzeit-Action verwandeln
- Warum der 5G-Rollout stockt: Kosten, Spektrum und Abdeckungsherausforderungen
- Edge Computing: Echtzeit-Daten freisetzen, Effizienz steigern, neue Revenue treiben
- G.hn: Die Industrial IoT Revolution für kosteneffiziente, zuverlässige Konnektivität antreiben
- Smart Manufacturing für das New Normal neu denken: Datengetriebene Strategien für Resilienz
- Daten: Das neue Öl – Wie Raffinerien rohe Information in Business Value verwandeln
- Der IT/OT-Hybrid-Profi: Brückenbauer zwischen Rechenzentren und Industrieautomation
- Microsoft eröffnet KI-Forschungsinkubator für General-Purpose-Intelligenz
- std::list in C++ meistern: Syntax, Funktionen & praktische Beispiele