2016-08-15 7 views
0

나는 DataWriter가 삭제 된시기를 감지하고 관련 데이터의 type_name을 알아야하는 RTI DDS 5.2를 사용하여 C++로 도구를 작성하고 있습니다. thisthis과 유사한 코드를 사용하고 있습니다.RTI DDS를 사용하여 삭제 된 DataWriter의 type_name을 확인하는 방법

나는 DDSWaitSet을 사용하고하고 DataWriter는 delete_datawriter로 삭제 될 때 트리거지고 있지만 SampleInfo 데이터가 유효하고 충분 확실하지 나타냅니다, 데이터 샘플 type_name가 비어 있습니다.

그런 방법으로 DataWriter를 삭제할 수 있습니까? 예 : 내장 된 주제 구독이 일까요? 또는이 동작을 수정하도록 설정할 수있는 QOS 설정이 있습니까?

답변

0

이 문제의 해결 방법을 찾았습니다. DataWriter가 사라지면 데이터 샘플을 유효하게 만드는 방법을 아직 모르지만 SampleInfo에는 작성자를 고유하게 식별하는 instance_state 필드가 있습니다. 해결책은 데이터가 유효 할 때 type_names을 추적하고 그렇지 않을 때 찾아보기뿐입니다. 다음은 문제를 해결하기 위해 사용하는 코드의 요지입니다 :

struct cmp_instance_handle { 
    bool operator()(const DDS_InstanceHandle_t& a, const DDS_InstanceHandle_t& b) const { 
     return !DDS_InstanceHandle_equals(&a, &b); 
    } 
}; 

void wait_for_data_writer_samples() 
{ 
    ConditionSeq cs; 
    DDSWaitSet* ws = new DDSWaitSet(); 
    StatusCondition* condition = _publication_dr->get_statuscondition(); 
    DDS_Duration_t timeout = {DDS_DURATION_INFINITE_SEC, DDS_DURATION_INFINITE_NSEC}; 
    std::map<DDS_InstanceHandle_t, std::string, cmp_instance_handle> instance_handle_map; 

    ws->attach_condition(condition); 
    condition->set_enabled_statuses(DDS_STATUS_MASK_ALL); 

    while(true) { 
     ws->wait(cs, timeout); 

     PublicationBuiltinTopicDataSeq data_seq; 
     SampleInfoSeq info_seq; 

     _publication_dr->take(
      data_seq, 
      info_seq, 
      DDS_LENGTH_UNLIMITED, 
      ANY_SAMPLE_STATE, 
      ANY_VIEW_STATE, 
      ANY_INSTANCE_STATE 
     ); 

     int len = data_seq.length(); 
     for(int i = 0; i < len; ++i) { 
      DDS_InstanceHandle_t instance_handle = info_seq[i].instance_handle; 

      if(info_seq[i].valid_data) { 
       std::string type_name(data_seq[i].type_name); 

       // store the type_name in the map for future use 
       instance_handle_map[instance_handle] = type_name; 
       if(info_seq[i].instance_state == DDS_InstanceStateKind::DDS_ALIVE_INSTANCE_STATE) { 
        do_data_writer_alive_callback(type_name); 
       } 
       else { 
        // If the data is valid, but not DDS_ALIVE_INSTANCE_STATE, the DataWriter died *and* we can 
        // directly access the type_name so we can handle that case here 
        do_data_writer_dead_callback(type_name); 
       } 
      } 
      else { 
       // If the data is not valid then the DataWriter is definitely not alive but we can't directly access 
       // the type_name. Fortunately we can look it up in our map. 
       do_data_writer_dead_callback(instance_handle_map[instance_handle]); 

       // at this point the DataWriter is gone so we remove it from the map. 
       instance_handle_map.erase(instance_handle); 

      } 
     } 
     _publication_dr->return_loan(data_seq, info_seq); 
    } 
}