2014-03-26 4 views
2

나는 boost :: asio :: io_service를 가지고 있습니다. 이제는 일정 시간이 지나면이 서비스를 중단하고 싶습니다. 내 첫 번째 접근 방식은 boost::thread(io_service.run())을 사용했지만 오류가 발생했습니다.
다른 방법으로 io_service를 중지 할 수 있습니까?
감사합니다.일정 시간이 지난 후 boost :: io_service를 중지하십시오.

+0

편집 – ikh

답변

2

deadline_timer을 사용할 수 있습니다. 당신이 시도처럼

당신은 또한 다른 스레드에서 서비스를 실행할 수 있습니다

다음
boost::thread t = boost::thread(boost::bind(&boost::asio::io_service::run, boost::ref(io_service)); 

// sometime 
io_service.stop(); // io_service is threadsafe 
t.join(); 

가에 완료 C++ 03 deadline_timer 예입니다 : Live On Coliru

#include <boost/asio.hpp> 
#include <boost/thread.hpp> 
#include <boost/asio/deadline_timer.hpp> 
#include <iostream> 

using namespace boost::asio; 
using namespace boost; 

io_service svc; 
deadline_timer timer(svc); 

void work() 
{ 
    this_thread::sleep_for(chrono::milliseconds(100)); 
    std::cout << "Work done, rescheduling\n"; 
    svc.post(work); 
} 

void expiration_handler(system::error_code ec) 
{ 
    if (ec != error::operation_aborted) 
     svc.stop(); 
} 

int main() 
{ 
    svc.post(work); 

    timer.expires_from_now(posix_time::seconds(2)); 
    timer.async_wait(expiration_handler); 

    svc.run(); 
} 

를 인쇄
Work done, rescheduling 

치명적일 때까지 2 초 후에 도달했습니다

+0

네, 고맙습니다! –

1

std::this_thread::sleep_for(std::chrono::seconds(10)); 
io_service.stop(); 

은 아닌가요?


사용 deadline_timer.

boost::asio::deadline_timer stop_timer(io_service); 

... 
// If require stopping 
stop_timer.expires_from_now(boost::posix_time::seconds(10)); 
stop_timer.async_wait(
    [&io_service](const boost::system::error_code &ec) 
    { 
     io_service.stop(); 
    }); 
+0

을 참조하십시오. 왜냐하면 당신은'io_service.run()'을 막고 있기 때문입니다. – sehe

+0

@sehe 편집 – ikh

+0

그래, 그게 더 비슷해. 내 버전은 C++ 11이 필요하지 않습니다. – sehe

관련 문제