2013-08-12 4 views
1

부스트 스레드 문서를 읽었으며 필자가 원하는 예제를 찾을 수 없습니다.부스트 타임 드레드가 완료되었는지 확인

시간이 지정된 스레드에서 메소드를 실행해야하며, 밀리 초 단위로 완료하지 않으면 시간 초과 오류가 발생합니다.

그래서 나는 다음과 같다 invokeWithTimeOut (라는 방법)이 있습니다

내가 (요청, 응답)를 호출 호출해야하며이 제한 시간 내에 완료되지 않을 경우, 메소드가 반환해야
// Method to invoke a request with a timeout. 
bool devices::server::CDeviceServer::invokeWithTimeout(CDeviceClientRequest& request, 
                 CDeviceServerResponse& response) 
{ 
    // Retrieve the timeout from the device. 
    int timeout = getTimeout(); 
    timeout += 100; // Add 100ms to cover invocation time. 

    // TODO: insert code here. 

    // Invoke the request on the device. 
    invoke(request, response); 

    // Return success. 
    return true; 
} 

그릇된.

누군가가 빠른 부스트를 부드럽게 할 수 있습니까? :이 작업을 수행하는 방법에 대한 예제.

참고 : 제한 시간은 밀리 초입니다. getTimeout() 및 invoke()는 모두 장치 하위 클래스에서 구현 된 순수 가상 함수입니다.

+0

여기서 invoke()는 무엇입니까? 그건 부스트 기능처럼 보이지 않습니다. –

+0

Invoke는 장치 (하위) 클래스에서 함수를 호출하는 getTimeout()과 같은 클래스의 순수 가상 메서드입니다. –

답변

2

간단한 솔루션 : 별도의 스레드에서 invoke를 시작하고 때 완료 호출 표시하기 위해 미래를 사용

boost::promise<void> p; 
boost::future<void> f = p.get_future(); 
boost::thread t([&]() { invoke(request, response); p.set_value(); }); 
bool did_finish = (f.wait_for(boost::chrono::milliseconds(timeout)) == boost::future_status::ready) 

did_finishtrue 될 것입니다 경우에만, 제한 시간 전에 완료 호출합니다.

흥미로운 질문은 그 하지 경우에 해당 할 것입니다. t 스레드를 정상적으로 종료해야하므로 스레드를 삭제하기 전에 보류중인 호출을 취소하고 join을 수행하는 메커니즘이 필요합니다. 이론적으로는 단순히 detach 스레드 일 수 있지만 실제로는 스레드와 상호 작용하는 모든 수단을 잃어 버리고 예고없이 수백 개의 교착 상태 스레드로 끝날 수 있으므로 실제로는 매우 나쁜 생각입니다.

+0

boost :: chrono를 사용하지 않는 버전이 있습니까? 우리는 boost :: datetime을 사용할 수 있습니다. –

+0

또한 컴파일러 오류로 인해 boost 멤버가 아닙니다. –

+0

미래가 동일합니다. –

관련 문제