2016-07-28 1 views
0

Boost.Log 비동기 싱크를 사용 중입니다 (Asynchronous sink frontend 참조). 적절한 종료를하려면 비동기 싱크대로의 레코드 공급을 정상적으로 중단하고 플러시해야합니다. 코어에는 싱크를 추가하거나 제거하는 방법이 있지만 클라이언트가 싱크대를 방문하거나 방문하는 방법이없는 것 같습니다. 문서는 stop_logging 방법,Boost.Log를 사용할 때 모든 비동기 싱크를 중지하는 방법

void stop_logging(boost::shared_ptr<sink_t>& sink) 
{ 
    boost::shared_ptr<logging::core> core = logging::core::get(); 

    // Remove the sink from the core, so that no records are passed to it 
    core->remove_sink(sink); 

    // Break the feeding loop 
    sink->stop(); 

    // Flush all log records that may have left buffered 
    sink->flush(); 

    sink.reset(); 
} 

을 가지고 있지만 특정 sink_t 형식을 사용합니다. asynchronous_sink frontend 클래스에는 싱크 백엔드 및 대기열 전략에 대한 템플릿 인수가 있습니다.

template<typename SinkBackendT, 
      typename QueueingStrategyT = unbounded_fifo_queue> 
    class asynchronous_sink; 

내가 싱크의 여러 가지 종류가있다, 그래서 내가 그들을 보유하고 일반 컨테이너를하고 싶은, 그래서 그 위에 간단한 반복 할 수 및 각 stop_logging 전화는 컨테이너에 가라.

이것은 Boost.Log에서 제공되는 인터페이스로 인해 해결해야 할 C++ 템플릿 데이터 구조에 대한 일반적인 질문입니다. Boost.Log 코어에 추가 한 비동기 싱크를 추적하는 데 사용할 좋은 데이터 구조는 무엇입니까? 종료시 stop_logging으로 전화 할 수 있도록 전화가 필요합니다.

내 첫 번째 간단한 방법은 boost::any 개의 벡터를 사용하는 것입니다. 그러나 그것은 다소 성 가시고 우아하지 않습니다. 난 합리적인 접근 방식은 λ 메서드가 stop_logging 호출하는 함수 개체의 벡터를 가질 것이라고 생각합니다. 그러나 나는 템플릿 유형에서 길을 잃었고 이것을 수행하는 방법을 모른다.

감사합니다. 감사합니다.

답변

1

가장 직접적인 해결책은 제안한 것처럼 기능 개체가있는 컨테이너를 사용하는 것입니다. 예를 들어이 예 sink에서

std::vector< std::function< void() > > stop_functions; 

// For every asynchronous sink you add 
stop_functions.emplace_back([sink]() 
{ 
    sink->flush(); 
    sink->stop(); 
}); 

는 로깅 코어에 추가 할 일이 asynchronous_sink의 인스턴스에 대한 포인터가 될 수 있습니다. 응용 프로그램이 종료되면 당신은 컨테이너에 저장된 모든 함수를 호출 할 수 있습니다

for (auto& stop : stop_functions) 
    stop(); 

그러나, allows이 과정을 조금 단순화하는 Boost.Signals2 라이브러리가있다. 당신은 신호를 생성하고 이런 식으로 기능을 연결할 수 있습니다

boost::signals2::signal< void() > stop_signal; 

// For every asynchronous sink you do 
stop_signal.connect([sink]() 
{ 
    sink->flush(); 
    sink->stop(); 
}); 

그런 다음 신호를 호출하여 효과적으로 모든 싱크를 중지 연결된 모든 함수 객체를 호출 할 수 있습니다.

stop_signal(); 

두 경우 모두 std::bind 또는 다른 방법으로 원하는 기능 개체를 만들 수 있습니다. 중요한 부분은 싱크 프론트 엔드에 대한 포인터를 유형과 함께 함수 오브젝트에 저장하는 것입니다.

관련 문제