2011-03-02 4 views
1

그래서 내가 스레드 작동하는 간단한 클래스를 만든 - 당신이되게 내 클래스에서 enherits 클래스의 가입 기능 목록에 모든 클래스의 무효 기능을 추가 할 수 있습니다Boost.Interprocess : 다른 프로세스에있는 클래스에서 함수를 호출하고 데이터를 보내는 방법은 무엇입니까?

#include <iostream> 
#include <vector> 

#include <boost/thread.hpp> 

// parts of c++0x std 
#include <boost/bind.hpp> 
#include <boost/function.hpp> 

#ifndef _CoreEvents_h_ 
#define _CoreEvents_h_ 

using namespace std ; 
template <typename DataType > 
class CoreEvents{ 

     typedef boost::function<void(DataType)> Function; 
     typedef std::vector<Function>  FunctionSequence; 
     typedef typename FunctionSequence::iterator FunctionIterator; 

public: 
     DataType* dataElement; 
     FunctionSequence funcs; 
     boost::thread_group tg; 

     CoreEvents() 
     { 
       dataElement = new DataType(); 
     } 
     // Function for adding subscribers functions 
     // use something like std::bind(&currentClassName::FunctionToAdd, this, std::placeholders::_1) to add function to vector 
     void Add(Function f) 
     { 
       funcs.push_back(f); 
     } 

     // Cast data to subscribers and clean up given pointer 
     //ToDo: One will be solved when pool of pre-initialized objects will be developed 
     virtual void Cast(){ 
       for (FunctionIterator it(funcs.begin()); it != funcs.end(); ++it){ 
         DataType dataCopy = *dataElement; 
         tg.create_thread(boost::bind(*it, dataCopy)); 
       } 
     } 
}; 

모든 당신이 필요 가입이다 : 우리가 스레드를 처리 할 때 간단

someClass->Add(boost::bind(&someOtherClass::someVoidFunction, this, _1)); 

- 우리는 항상 예를 ​​들어 create_thread을 요구하고 모든 우리가 다른 응용 프로그램 스레드에서 수행 할 필요가있을 수 있습니다.

그러나 우리가 app1 app2와 app3을 갖고 있고 하나의 프로세스와 함수를 사용하는 폼의 포인터를 공유하고 싶다면 그 프로세스를/app의 매개 변수로 호출 할 수 있도록 다른 응용 프로그램에 그 포인터를 둡니다.

실제로 우리는 편집 가능한 텍스트 feild가 실행되지 않는 앱과 편집 가능한 텍스트 필드가 실행중인 앱이있는 것처럼 보입니다. 우리는 편집 가능한 TF에서 입력을 편집 할 수없는 TF에 연결할 수있는 №3 응용 프로그램을 가지고있었습니다.

Boost.Interprocess과 같은 일을 할 수 있습니까?

나는 C 아주 새로운 오전 ++하지만 난 어떤 bad info related을 찾은 것 같아 :

언급

참조 포인터와 같은 문제 (주로 때문에 포인터로 구현됩니다)으로 고생 금지. 그러나 현재 연산자를 완벽하게 실행 가능한 스마트 참조 을 C++로 생성 할 수 없습니다 (예 :연산자를 오버로드 할 수 없음). 따라서 사용자가 개체를 공유 메모리에 넣으려는 경우 개체는 스마트 ( ) 참조를 구성원으로 가질 수 없습니다.

매핑 된 영역이 메모리 세그먼트를 공유하는 모든 프로세스에서 동일한 기본 주소에 매핑되는 경우에만 참조가 작동합니다. 포인터와 마찬가지로 참조가 매핑 된 영역 에 배치 된 경우 해당 매핑 된 영역 의 객체 만 가리켜 야합니다.

Virtuality 금지

가상 테이블 포인터와 가상 테이블은 주소 공간 객체를 생성하는 프로세스의 에, 우리는 가상 함수 또는 가상베이스 클래스로 클래스를 배치하면 공유 메모리에있는 가상 포인터는 다른 프로세스에서는 유효하지 않으며 충돌합니다. 각 프로세스는 다른 가상 테이블 포인터와 포인터 이 많은 프로세스간에 공유되는 것을 포함 객체를 필요로하기 때문에

이 문제는 해결 매우 어렵다.Even 모든 프로세스에서 동일한 주소 인 의 매핑 된 영역을 매핑하는 경우 가상 테이블은 모든 프로세스에서 다른 주소에있을 수 있습니다. 프로세스 사이에 공유 된 개체에 대해 가상 함수를 사용하려면 깊은 컴파일러 변경이 필요하며 가상의 함수는 의 성능 저하가 발생합니다. 그렇기 때문에 Boost.Interprocess 에는 가상 함수를 지원할 계획이없고 상속 된 가상 사상 된 영역이 프로세스간에 공유됩니다.

클래스의

정적 구성원이 클래스의 모든 인스턴스가 공유하는 글로벌 객체 정적 클래스 멤버에주의

. 이 때문에 정적 멤버 은 프로세스의 전역 변수로 구현됩니다. 정적 회원들과 클래스를 구성 할 때

는, 각 프로세스는 그래서 하나 개의 프로세스에서 정적 멤버는 정적 멤버 다른 프로세스의하지 변화 값을 수행 업데이트 정적 멤버의 복사본 있습니다. 따라서이 클래스들에는 을 조심하십시오. 정적 멤버는 프로세스가 시작될 때 가 초기화 단지 일정한 변수가 아닌 경우 위험 있지만 (열거 형처럼 를 사용하는 경우, 예를 들어)과 그 값이 모두 동일 입니다 그들은 모든에서 변경을한다.

하지만 동일한 라이브러리를 사용하여 모든 앱을 만들고 있습니다. 최고의 성능이 필요할 때 스레딩을 사용할 것이지만 프로세스 간 통신이 필요합니다. 그렇다면 어떻게해야합니까? 필요한 기능을 에뮬레이트하는 메커니즘을 만드는 방법은 무엇입니까?

답변

2

죄송합니다.이 질문은 이해하기가 약간 어렵지만 대답하려고합니다.

프로세스 간의 포인터 공유는 거의 해야합니다. 그것은 매우 위험합니다. 기본이 아닌 데이터를 공유하는 경우도 싫증납니다 만, 경우에 따라 괜찮습니다.

일반적으로 메시징과 같은 것을 사용해야합니다. Boost.Interprocess를 사용하여 매개 변수를 공유 할 수 있습니다.

+0

거의 불가능합니다 ... 가능하다는 것을 의미합니다 ... - 저는 매우 위험합니다. 위험 할 수 있습니다. 그런 일을하는 방법? – Rella