2013-06-04 2 views
4

omniORB 및 C++을 사용하고 있습니다.C++을 사용하여 CORBA 시퀀스를 추가하는 쉬운 방법

내 응용 프로그램에서 나는 작은 모듈을 몇 개의 작은 CORBA 형태로 만든다. 그리고 나는 더 많은 처리를 위해 그것들을 하나의 큰 순서에 결합 할 필요가있다. 쉬운 방법이 있나요? seq2.append(seq1) 또는 seq2.push_back(seq1)과 같은 것입니다. 또는 일부 운영자입니까? (나는 STL- 물건에서 정말로 초보자 다).

내가 찾은 유일한 방법은 수동으로 작은 시퀀스의 모든 요소를 ​​살펴보고 큰 시퀀스에 추가하는 것입니다.

//idl 
struct Device; 
typedef sequence<Device> DevicesList; 

//c++ 
icore::DevicesList full_list; 
foreach (const DStatusList &stlist, states_) { 
    icore::DevicesList list = convertList(stlist); 
    int newlength = full_list.length() + list.length(); 
    int last_index = full_list.length(); 
    full_list.length(newlength); 
    int j=0; 
    for(int i=last_index; i< last_index+list.length(); i++,j++) { 
     full_list[i] = list[j]; 
    } 
} 

감사합니다.

+0

제 경우에는 기본 목록 (CORBA가 아님)을 결합한 다음 결과를 CORBA 목록으로 변환 할 수 있습니다. 그러나 질문은 다른 방법을 알기를 요청했습니다. 나쁜 영어에 유감 스럽지만. – uni

+2

나는 그런 식으로 사용하는 것이 좋습니다 : 가능하면 통신을 위해 CORBA 유형을 유지하고 처리를 위해 std (또는 자신의) 컨테이너를 사용하십시오. – stefaanv

+1

새로운 IDL에서 C++ 11l 로의 언어 매핑은 특수 CORBA 유형 대신 표준 컨테이너를 사용합니다.이 새로운 매핑을 지원하는 CORBA 구현 인 TAOX11에 대해서는 http://swsupport.remedy.nl을 참조하십시오. –

답변

5

이와 같은 작업을 수행 할 때 유틸리티 기능을 거의 사용하는 것이 어렵지 않습니다. 예를 들어, CORBA 시퀀스에 대한 자신와 push_back을 할 수 있습니다 :

template<class Seq, class T> 
void push_back(Seq& seq, const T& item) 
{ 
    const CORBA::ULong len = seq.length(); 
    seq.length(len + 1); 
    seq[len] = item; 
} 

MySequence s; 
push_back(s, 42); 

가 그냥 몇 가지 ORB의 시퀀스 유형 (같은 std::vector가하는) push_back 메모리를 과도하게 할당하지 않는 것을 알고, 그래서 이것은 재 할당을 트리거 할 수 있으며, 매번 push_back() 전화로 복사. 성능 문제 일 수 있습니다. ORB가 문제를 일으키는 지 알기 위해 소스를 살펴봄으로써 ORB가이 작업을 수행하는지 여부를 확인해야합니다. 불행히도 omniORB에는이 문제가 있다고 생각합니다. 적어도 몇 년 전에 그랬습니다.

이 문제를 완화하는 한 가지 방법은 최대 값 (미리 알고있는 경우)을 사용하여 시퀀스를 구성하는 것입니다. 이것은 앞까지 하나 개의 큰 할당을 만들 것입니다 그리고 당신은 다음 재 할당을 트리거하지 않고 그 최대까지 push_back()를 호출 할 수

MySequence s(100); // construct with maximum; allocation happens here 
push_back(s, 42); // no reallocation 
push_back(s, 0);  // no reallocation 

은 또한 코멘트에 stefaanv의 조언에 동의합니다. 가능한 한 CORBA 순서를 사용하십시오. 기본적으로 CORBA 호출을 수행/수신해야하는 응용 프로그램의 "가장자리"에만 사용하십시오. 가능한 한 빨리 조작 할 수있는 표준 컨테이너로 데이터를 가져옵니다. CORBA가 응용 프로그램에 "스며 들기"를 입력하지 마십시오. 또한 비 CORBA 환경으로 이식하기로 결정한 경우 응용 프로그램의 이식성을 높이는 데 도움이됩니다.

새로운 IDL 대 C++ 11 매핑이 제안되었습니다. IDL 시퀀스를 바로 std::vector에 매핑하면 작업이 훨씬 쉬워집니다.

+2

IDL에서 C++ 11로 IDL 시퀀스를 std :: vector로 매핑하는 것이 옳다. 이 IDL에서 C++ 11 로의 매핑은 채택되었으며 공식적으로 OMG 표준으로 발표되었습니다 (http://www.omg.org/spec/CPP11/). 다가오는 OMG Berling 회의에서 V1.1 개정판을 발표 할 예정입니다. http://www.omg.org/techprocess/meetings/schedule/IDL_to_C++11_1.1_RTF.html에서 온라인으로 보거나 http : /osportal.remedy.nl. 이 사양은 TAOX11 제품의 일부로 이미 완벽하게 구현되었습니다 (http://www.theaceorb.nl 참조). –

관련 문제