차단 기능이있는 타사 라이브러리를 사용하고 있습니다. 즉, 완료 될 때까지 반환되지 않습니다. 그 전화에 대한 시간 제한을 설정할 수 있습니다.호출을 막고 바로 메서드 호출
문제는 해당 함수가 라이브러리를 특정 상태로 만듭니다. 그 상태로 들어가 자마자, 나는 내 자신의 코드에서 뭔가를 할 필요가있다. 그것은
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가 완료되도록 충분히 높은 시간 제한을 설정하고 라이브러리 함수가 호출되었는지 확인하기 위해 포스트 콜 작업을 수행하기 전에 충분히 지연을 설정합니다. 결정적이지는 않지만 대부분의 경우 작동합니다.
혼란 스럽습니다. 차단 호출이 반환 된 후에해야 할 일을 분명하게 이해할 수없는 이유는 무엇입니까? 왜 두 번째 스레드입니까? –
@ 존 : 나는 문제가 전화가 걸려 왔지만 돌아 오기 전에 상태를 변경해야한다고 해석했다. 나는 비록 틀릴 수 있었다. ... –
@ John : 그것은 Alex가 말했던 것처럼이다. 가능한 한 빨리 처리해야합니다 (하드웨어 문제) –