2014-03-26 189 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(); 

這裏有一個deadline_timer例如完成C++ 03: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 

直到死亡ne在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

相關問題