DDS有兩種async模式,listener和waitset (這邊指的async是main thread不用一直去poll dds_read)
listener 有點像一般的callback,程式碼也較簡單
而waitset則是讓main thread等一段時間,等到事件觸發再去做事情
程式碼較多
但是,listener 裡面如果程式執行太久會影響底層的DDS接收data (會掉資料,嚴重的話程式會死掉)
所以當你程式較複雜的話,建議用waitset 搭配thread去做處理
listener比較適合簡單的使用情境
listener :
static void data_available_handler (dds_entity_t reader)
{
dds_take (reader, samples, max_samples, info, mask);
}
void main( void )
{
dds_readerlistener_t listener = {0};
listener.on_data_available = data_available_handler;
dds_reader_create (subscriber, &reader, topic, qos, &listener);
while (1) {
dds_sleepfor(DDS_MSECS(100));
}
}
|
waitset :
void main( void )
{
dds_reader_create (subscriber, &reader, topic, qos, NULL);
dds_waitset_t ws = dds_waitset_create ();
dds_condition_t cond = dds_readcondition_create(reader,mask);
dds_waitset_attach(ws,cond,reader);
dds_attach_t wsresults[1];
size_t wsresultsize = 1u;
dds_time_t timeout = DDS_SECS (10);
while (1) {
ret = dds_waitset_wait (ws, wsresults, wsresultsize, timeout);
if (ret > 0) {
dds_take (wsresults, samples, max_samples, info, mask);
}
dds_sleepfor(DDS_MSECS(100));
}
}
|
沒有留言:
張貼留言