Я каждый день узнаю больше о ддс, поэтому мой вопрос звучит странно. Я надеюсь, что это имеет смысл.
Одно из требований, предъявляемых к какой-либо оболочке dds, которую я пишу, заключается в том, что по истечении некоторого времени ожидания оно истекает, если не удается записать. Мой вопрос: Как я могу это сделать?
На Учебник сайта Prism Tech, есть объяснение того, как использовать 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
объект, а не конкретный вызов написания. Могу ли я связать это с вызовом выше?
Это настраивается в QoS, см. НАДЕЖНОСТЬ, поле «max_blocking_time». То, как вы установите это значение, будет зависеть от реализации поставщика. Обычно вы получаете текущее QoS, обновляете поле и записываете QoS обратно. Имейте в виду, что определенные политики QoS должны быть установлены до того, как что-то еще произойдет. Надежность — это «Перед включением» (по крайней мере, в той реализации, с которой я больше всего знакома), что означает, что вам нужно отключить средство записи данных, обновить QoS, а затем включить средство записи.
Если QoS можно установить вне приложения (например, через XML), вы можете легко установить политику. В противном случае вам нужно сделать это в коде.
Из спецификации:
Значение max_blocking_time указывает максимальное время, в течение которого операции DataWriter :: write разрешено блокировать, если у DataWriter нет места для хранения записанного значения. Значение по умолчанию max_blocking_time = 100 мс.
Других решений пока нет …