【问题标题】:OpenSplice DDS: Publish, until some timeoutOpenSplice DDS:发布,直到超时
【发布时间】:2017-02-03 11:42:29
【问题描述】:

我每天都在学习更多关于 dds 的知识,所以我的问题听起来很奇怪。我希望这是有道理的。

我正在编写的某些 dds 包装器的要求之一是,如果它无法写入,它会在一段时间后超时。 我的问题:我该怎么做?

Prism Tech's website's tutorial 上,有关于如何使用WaitSet 来阻止读取操作的说明,但是写入呢?

这是一些包含问题的代码:

dds::domain::DomainParticipant dp(0);
dds::topic::Topic<MyType> topic(dp, "MyTopic");
dds::pub::Publisher pub(dp);
dds::pub::DataWriter<MyType> dw(pub, topic);

MyType t;
dw.write(t); //how can I make this block for 5 seconds (tops), and then throw an error on failure?

我注意到 API DataWriter::wait_for_acknowledgements(int timeout) 中存在一个函数,但这似乎绑定到 DataWriter 对象,而不是特定的编写调用。我可以将它与上面的调用绑定吗?

【问题讨论】:

    标签: c++ synchronous data-distribution-service opensplice


    【解决方案1】:

    这是在 QoS 中配置的,参见 RELIABILITY,字段“max_blocking_time”。如何设置此值将取决于供应商的实施。通常你得到当前的 QoS,更新字段,写回 QoS。请记住,必须在其他事情发生之前设置某些 QoS 策略。可靠性是“启用之前”(至少在我最熟悉的实现中),这意味着您需要创建禁用的数据写入器,更新 QoS,然后启用写入器。

    如果可以在应用程序外部设置 QoS(例如通过 XML),那么您可以轻松设置策略。否则,您需要在代码中完成。

    来自规范:

    max_blocking_time 的值表示如果 DataWriter 没有空间存储写入的值,则允许 DataWriter::write 操作阻塞的最长时间。默认 max_blocking_time=100ms。

    【讨论】:

    • 非常感谢!我会尽快尝试这个解决方案并报告。我想在这段时间之后它会抛出一个错误,我可以捕捉和处理,对吧?
    • 取决于实现和语言,是否是 DDS_RETCODE_TIMEOUT、RETCODE_TIMEOUT、dds::core::TimeoutError、TimeoutException 等。通常这是资源约束而不是通信问题(历史不够深入,此参与者的内存已耗尽等)。
    猜你喜欢
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多