我有一个boost :: asio :: io_service正在做一些工作。现在我想在一段时间后停止这项服务。我的第一种方法是使用boost::thread(io_service.run())
,但后来我得到了错误
还有其他方法可以阻止io_service吗?
谢谢!
答案 0 :(得分:3)
您可以使用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秒后达到截止日期
答案 1 :(得分:1)
<击> 撞击>
<击>std::this_thread::sleep_for(std::chrono::seconds(10));
io_service.stop();
不是吗?
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();
});