2012-06-22 4 views
1

차단 기능이있는 타사 라이브러리를 사용하고 있습니다. 즉, 완료 될 때까지 반환되지 않습니다. 그 전화에 대한 시간 제한을 설정할 수 있습니다.호출을 막고 바로 메서드 호출

문제는 해당 함수가 라이브러리를 특정 상태로 만듭니다. 그 상태로 들어가 자마자, 나는 내 자신의 코드에서 뭔가를 할 필요가있다. 그것은

void LibraryWrapper::DoTheMagic(){ 
    //... 
    boost::thread EnteredFooStateNotifier(&LibraryWrapper::EnterFooState, this); 
    ::LibraryBlockingFunction(timeout_); 
    //... 
} 

void LibraryWrapper::EnterFooState(){ 
    ::Sleep(50); //Ensure ::LibraryBlockingFunction is called first 
    //Do the stuff 
} 

가 아주 불쾌한되지 않은 : 내 최초의 솔루션은 별도의 스레드에서 그렇게했다? :: LibraryBlockingFunction은 내가 아래에서하는 일을하기 전에 반드시 호출되어야하기 때문에 Sleep 콜을 넣어야했습니다. 그렇지 않으면 모든 것이 실패 할 것입니다. 그러나 50 밀리 초를 기다리는 것은 확실한 보장이 아니므로이 특정 작업을 가능한 빨리 수행해야하기 때문에 더 기다릴 수 없습니다.

더 좋은 방법은 없나요? 도서관 코드에 액세스 할 수 없다고 생각하십시오. 부스트 솔루션을 환영합니다.

업데이트 : 답변 중 하나와 마찬가지로 라이브러리 API가 잘못 정의되어 있습니다. 개발자에게 문제를 설명하고 해결 방법을 제안하는 전자 메일을 보냈습니다 (즉, 호출을 차단하지 않고 상태 변경을 알리는 등록 된 콜백에 이벤트 보내기). 그 동안, 나는 물건 X가 완료되도록 충분히 높은 시간 제한을 설정하고 라이브러리 함수가 호출되었는지 확인하기 위해 포스트 콜 작업을 수행하기 전에 충분히 지연을 설정합니다. 결정적이지는 않지만 대부분의 경우 작동합니다.

+0

혼란 스럽습니다. 차단 호출이 반환 된 후에해야 할 일을 분명하게 이해할 수없는 이유는 무엇입니까? 왜 두 번째 스레드입니까? –

+0

@ 존 : 나는 문제가 전화가 걸려 왔지만 돌아 오기 전에 상태를 변경해야한다고 해석했다. 나는 비록 틀릴 수 있었다. ... –

+0

@ John : 그것은 Alex가 말했던 것처럼이다. 가능한 한 빨리 처리해야합니다 (하드웨어 문제) –

답변

2

부스트 미래를 사용하면이 코드가 명확 해 집니까? boost future documentation에서 예를 사용하려면, 당신은 여전히 ​​아마도 함수 호출이 일어난 것을 보장하기 위해 약간의 딜레이가 필요하지만

int calculate_the_answer_to_life_the_universe_and_everything() 
{ 
    return 42; 
} 

boost::packaged_task<int> pt(calculate_the_answer_to_life_the_universe_and_everything); 
boost::unique_future<int> fi=pt.get_future(); 

boost::thread task(boost::move(pt)); 

// In your example, now would be the time to do the post-call work. 

fi.wait(); // wait for it to finish 

을 (문제의이 비트 오히려 잘못 정의 된 것 -가 통화 후 상태 변경을 실행하는 것이 안전 할 때 결정 론적으로 설정할 수있는 방법은 무엇입니까?).

+0

우와, 이거 재미 있네, +1. Boost의 미래에 대해 읽어보기 시작하겠습니다. 지연에 대해서는 포스트 콜 변경 작업을 수행하기 위해'LibraryBlockingFunction'이 실행되어야한다는 것만 알면됩니다. 라이브러리 개발자와 활발히 접촉하고 있으므로 API의 변경을 요청할 수는 있지만 시간이 오래 걸릴 수 있습니다. –

2

나는 그것이 당신이 할 필요가있다 이해 문제 : 당신이 차단 호출을 입력 한 후

  1. 가 차단 호출
  2. 를 입력하지만이 완료되기 전에, 당신은 뭔가 다른
  3. 을 할 필요가
  4. 당신은 당신이 결정 방법이 accomish 수있는 방법은 없습니다, 차단 호출이 순수 C++ 관점에서

을 반환하기 전에 완성 된 # 2이 필요합니다. 그것은 사용중인 라이브러리의 세부 사항을 이해하지 못하는 것입니다.

그러나 시간 초과 값을 확인했습니다. 아마도 허점을 줄 수도 있습니다. 당신이 경우 어떻게

: 즉시

  • 을 반환하도록

    1. 가 0의 타임 아웃 차단 호출을 입력은 동일한 스레드 또는 메인 스레드와 동기화하거나, 당신에게 다른 물건을 수행. 아마도 장벽을 사용합니다.
    2. # 2가 완료된 것으로 확인되면 정상적인 0이 아닌 시간 초과로 차단 호출을 다시 입력하십시오.

    제한 시간이 0 인 차단 호출을 입력하면 라이브러리의 상태가 변경되는 경우에만 작동합니다.

  • +0

    타임 아웃을 0으로 설정할 수 없습니다 : 즉, 하드웨어 A는 하드웨어 B의 작업을 전혀 기다리지 않습니다. 타임 아웃은 하드웨어 A가 상태 S에 머무르고 물건 X가 발생할 때까지 기다리는 시간과 관련됩니다. –

    관련 문제