2019年4月11日 星期四

DDS Listener & waitset

Something worth pointing out is that the handler code will execute in a middleware thread.
As a result, when using listeners you should try to minimize the time spent in the listener itself.
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)
{
    /*read or take data*/
    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);
 
 
    /* wait 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));
    }
}

沒有留言:

張貼留言

NoSQL Redis intro

Redis是一個使用ANSI C編寫的開源、支援網路、基於記憶體、可選永續性的鍵值對儲存資料庫。 支援rdb 及aof 兩種儲存方式 From  https://zh.wikipedia.org/wiki/Redis Redis 目前擁有兩種資料...